フォームをまたいだ処理が依然解決しません。見よう見まねでソースを書いてみたら……
◆◆◆◆◆Form1.h◆◆◆◆◆
pragma once
#include "Form2.h"
#include "Hage.h"
namespace Hoge
{
public __gc class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
}
~省略~
private: Henachoko *henachoko;
~省略~
private: System::Void button1_Click(System::Object * sender, System::EventArgs * e)
{
Henachoko* henachoko=Henachoko::getInstance();
henachoko->SetHanage(1);
}
◆◆◆◆◆Form2.h◆◆◆◆◆
#pragma once
#include "Hage.h"
#include
#include
#include "windows.h"
#include "mmsystem.h"
#ifdef GetObject
#undef GetObject
#endif
namespace Hoge
{
public __gc class Form2 : public System::Windows::Forms::Form
{
public:
Form2(void)
{
InitializeComponent();
}
~省略~
private: Henachoko *henachoko;
~省略~
private: System::Void Form2_Load(System::Object * sender, System::EventArgs * e)
{
Henachoko* henachoko=Henachoko::getInstance();
int hanage=henachoko->GetHanage();
}
◆◆◆◆◆Hage.h◆◆◆◆
#pragma once
namespace HOGE
{
using namespace System;
public __gc class Henachoko
{
private:
Henachoko(void) {}
static Henachoko* henachoko;
int hanage;
Henachoko* Henachoko::henachoko = new Henachoko();
public:
Henachoko();
~Henachoko();
public:
void SetHanage(int);
int GetHanage();
};
};
◆◆◆◆◆Hage.cpp◆◆◆◆
#include "StdAfx.h"
#include ".\change.h"
#include "stdlib.h"
#include "time.h"
#using
using namespace HOGE;
void Henachoko::SetHanage (int hanage)
{
this->hanage=hanage;
}
int Henachoko::GetHanage (void)
{
return this->hanage;
}
error C2086: 'HOGE::Henachoko __gc *HOGE::Henachoko::henachoko' : 再定義されました。
error C2535: 'HOGE::Henachoko::Henachoko(void)' : メンバ関数は、既に定義または宣言されています。
error C3845: 'HOGE::Henachoko::henachoko' : __gc クラスまたは値の型の中ではスタティック データ メンバのみ初期化することができます。
といったエラーが出力されてしまいます。ううむ、やはりこの手は諦めたほうがいいのかしら。
コメント (11)
daihikoさん。
Henachokoクラスのpriveteの中にある
Henachoko* Henachoko::henachoko = new Henachoko();
は取って下さい。Henachokoクラスの{}の外で( };より下)
で
Henachoko* Henachoko::henachoko = new Henachoko();
の一文を追加してください。
public宣言の方にコンストラクタHenachoko();が定義されていますのでそちらを削除してください。コンストラクタが二つ定義されてしまっています。
それと、publicの方に
static Henachoko* getInstance(void) {
return henachoko;
}
は追加されていますか?
これでちょっと様子を見てくださいますか?^^
投稿者: たか | 2005年11月16日 06:20
あと、Form2(void)とForm1(void)内で
henachoko=Henachoko::getInstance();
をしてやってください。クラスのメンバ変数henachokoにポインタを設定する処理が抜けています。
で、上を追加したあとで
Form2_Loadと
button1_Click
での
Henachoko* henachoko=Henachoko::getInstance();の処理を取って下さい。ポインタ変数がその関数内の変数になっていますので。
余談ですが、クラスのメンバ変数の場合、マイクロソフトのコードなどでは頭にm_を付けて m_henachoko などとして普通の変数と間違えないように命名する場合が多いです^^
Javaとかになるとまたお作法が違うのでしょうね。meguさん?
C同士でも、UnixとWindowsでは関数名の付け方などのお作法が違います。Unix系では、getXXXとか小文字で書く人がおおいですけど、Windowsでは、GetXxxみたいな感じで頭大文字が多いですね。余談でした^^
投稿者: たか | 2005年11月16日 06:36
さっそく、たかさんの言うとおりにやってみました。
すると、今度は、
「error C3366: 'HOGE::Henachoko::Henachoko' : マネージ クラスの静的データ メンバはクラス定義内で定義する必要があります。」
というエラーが、「Henachoko* Henachoko::henachoko = new Henachoko();
」のところで出ますー。書くところが間違っているのかしら。
投稿者: daihiko | 2005年11月16日 15:56
daihikoさん。やはり、マネージコードでは普通にやってはダメなようですね。すいません。
いま、ちょっとやってみました。
daihikoさん。
マネージクラスなので普通のC++作戦ではダメのようですね。
検証せずに言ってしまいました。m(__)m。
今、ちょこっとやってみました。で、解決策案なのですけど、
namespace HOGE
{
using namespace System;
public __gc class Henachoko
{
private:
static Henachoko(void)
{
henachoko = new Henachoko();
}
static Henachoko* henachoko;
int hanage;
public:
static Henachoko * getInstance()
{
return henachoko;
}
//Henachoko();
//~Henachoko();
public:
void SetHanage(int);
int GetHanage();
};
};
この様にやってみて下さい。コンストラクタをstaticで宣言してやるとインスタンスが生成されるまでに確実に一度だけコンストラクタが呼び出されるようなので結果、シングルトンな動きができるようです。
簡単なテストをしてみましたが値が受け継がれてましたので恐らく大丈夫かなと思われます。検証してみてください^^
投稿者: たか | 2005年11月16日 17:51
たかさん、それでできました! 実はお話は半分も理解して
いませんが、とりあえず今度からシングルトン的な動作を期待
するときにはそうすることにします。
本当にありがとうございました。
投稿者: daihiko | 2005年11月16日 18:55
(´▽`) ホッ
動いて良かったです。
僕も勉強になりましたぁー^^
投稿者: たか | 2005年11月16日 19:15
megu@一ヵ月後にはBMW乗りかもしんまい....でございます(; ;)
daihikoさん、たかさん!すごい~!!
フォームをまたぐ処理がちゃんと動くようになったのですネ!?
やはり細かい部分のお作法が異なるようで、私じゃ要領を得なかったですね。
ごめんなさい。
>Javaとかになるとまたお作法が違うのでしょうね。meguさん?
そうそう、いろいろ違うみたいですね。
最初の頃、Cの感覚で文字列をszStrみたいな名前の付け方をしていたら笑われました。(この場合、ただのstrが普通です。)
クラス名は大文字で始まるけれど、変数(定数以外)やメソッドは絶対に大文字で始めてはなりません。
#そういう法律はありませんが....笑。たぶん、コンパイルは通ると思いますが常識では考えられません。
メソッドの命名もだいたい規則みたいなのがあって動詞+目的語!
主語+動詞みたいなメソッド名をつけると笑われちゃいます....
クラスのメンバ変数というのは、Javaでいうとクラス変数ということかしら?
それなら、命名による区別はなかったかもデス。
う~ん、アウディとさよならするのが悲しい....
両方ほしい!
投稿者: megu | 2005年11月16日 21:39
meguさん。
命名規則とかコーディングお作法とかで前職では激しい口論をした事もございます。しばらく不穏な感じになりました(笑)
if文の括弧はどこにつけるとかif文の後ろはスペース空けるかどうかとか色々ありましたねぇー...( = =) トオイメ
投稿者: たか | 2005年11月16日 22:20
☆たかさん
わかります、わかります....
お作法は人によって違うので、もう、口論しだすときりがありません(^^;;;;
変な標準をもったプロジェクトもありますしね。
#気にくわなくても従うしかない...とほほ
もし、押しの強い人と同じプロジェクトになったら、彼のやりかたについていきます。(気に食わなくても(笑)穏便にすますために....)
括弧の書き方もそうですが、複数ステップをひとつにしてしまって余分な変数を定義したくない私なのですが、
ひとつひとつきっちりやらないと気のすまない人と一緒になったときは参りました....(^^;;;;
まぁー、いろいろあります。
今の仕事もいろいろあります。
毎日きれそうですが、なんとか顔は笑っています。(ひきつっているかも~)
投稿者: megu | 2005年11月16日 22:48
meguさん:
> やはり細かい部分のお作法が異なるようで、私じゃ要領を得なかったですね。
いえいえ、そんなことないですよー。シングルトンに目を付けられたのがmeguさん、
実装したのがたかさん、おふたりの協力がなければ難しい作業でした。本当に
ありがとうございました。
> う~ん、アウディとさよならするのが悲しい....
BMWにお決めになったようですねー。グレードとか装備はどういうのにするのでしょうか。
投稿者: daihiko | 2005年11月19日 12:13
daihikoさん....
それがですね、、、
やっぱり私一ヵ月後もAudi乗りのままでいることになりましたっ!!
本当にBMWさんには、「もう決めました」といって、きめに行くまさにその日、、、、
やっぱり悲しくなって
ぎりぎりになって急遽行き先を変えてaudiに行っちゃいました....
なんだかほっとしています*^^*
これからもよろしく~
投稿者: megu | 2005年11月21日 22:15