同一クラスのコンストラクタ呼び出し

[戻る]
おみおみ 2006/03/30(木) 21:47:04
CTestClass::CTestClass(void)
{
    MessageBox( NULL, "CTestClass(void)", "", MB_OK );
}

CTestClass::~CTestClass(void)
{
    MessageBox( NULL, "~CTestClass(void)", "", MB_OK );
}

void CTestClass::Func( void )
{
    CTestClass();//★
}

void CYobidashi::Yobidashi( void )
{
    m_TestClass.Func();//メンバ変数
         m_TestClass.Func();//
}

上記★のようにあるクラス内で、そのクラスのコンストラクタを呼び出すと、
その直後にデストラクタが呼ばれます。
具体的には、Yobidashi()を実行すると、
「CTestClass(void)"」「~CTestClass(void)」「CTestClass(void)"」「~CTestClass
(void)」と
メッセージ表示されます。
メンバ変数が消滅してるわけでもないのになぜデストラクタが呼ばれるのでしょうか?
コンストラクタを呼んだときに別の変数が生成されるのでしょうか?

コンストラクタの部分を普通のメンバ関数とすれば何の問題もないのですが、
できれば原因が知りたいので、よろしくお願いします。

おみおみ 2006/03/30(木) 22:07:45
環境書き忘れました。
VC++.net MFC

あと、本当にやりたいのは、

CTestClass::CTestClass(void)
{
   //全コンストラクタの共通処理
}

CTestClass::CTestClass( INT i )
{
    m_i = i;
  CTestClass();
}

のように、あるコンストラクタから、別のコンストラクタを呼びたいのです。
全コンストラクタの共通処理を別関数にすればいいのでしょうが、
そうしないといけないのであれば、どうも不便で。

επιστημη 2006/03/30(木) 22:36:26
> あるコンストラクタから、別のコンストラクタを呼びたいのです。

許されていません。

Ban 2006/03/31(金) 08:12:26
こういう場合、C++ では(可能なら)デフォルト引数を使ったりします。

デフォルトでは m_i を 0 初期化している場合、上記の「本当にやりたいの」は

CTestClass::CTestClass( INT i = 0)
{
    m_i = i;
    // その他の共通処理
}

こうなります。

Ban 2006/03/31(金) 08:17:08
補足:このコンストラクタ一つで、以下の両方の記述が可能。
CTestClass   foo;
CTestClass   bar(12);

REE 2006/03/31(金) 10:10:36
>メンバ変数が消滅してるわけでもないのになぜデストラクタが呼ばれるのでしょうか?

void CTestClass::Func( void )
{
    CTestClass();//★
}

ちなみにこう書くと、
新しく一時オブジェクトが作られ、その後すぐ破棄されます。

PATIO 2006/03/31(金) 11:54:12
> 全コンストラクタの共通処理を別関数にすればいいのでしょうが、
> そうしないといけないのであれば、どうも不便で。

共通処理をInitとかという名前で別関数で作成してコンストラクタの中でも
呼ぶようにすれば良いだけなのでは?
コンストラクタとデストラクタはクラスメソッドの中でも
特別扱いするべきものなので他の関数と同じようには使えないと
割り切らないとC++ではプログラミングできないと思いますよ。
規格書とかきちんと読めば、どうしてそうしているのか書かれているかも
しれませんが、そこまでしなくてもそういうものだという納得でも
別に不自由はしませんし。
単に知りたいというだけの話なら調べてみるのも一興かと。

おみおみ 2006/03/31(金) 20:05:25
[[解決]]
皆様いろいろありがとうございます。
PATIOさんのおっしゃる方法でやろうと思います。

>ちなみにこう書くと、
新しく一時オブジェクトが作られ、その後すぐ破棄されます。

そういうことだったんですね。

古いスレッドには追加発言できません。