同一クラスのコンストラクタ呼び出し – プログラミング – Home

同一クラスのコンストラクタ呼び出し
 
通知
すべてクリア

[解決済] 同一クラスのコンストラクタ呼び出し


おみおみ
 おみおみ
(@おみおみ)
ゲスト
結合: 20年前
投稿: 20
Topic starter  

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)」と
メッセージ表示されます。
メンバ変数が消滅してるわけでもないのになぜデストラクタが呼ばれるのでしょうか?
コンストラクタを呼んだときに別の変数が生成されるのでしょうか?

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


引用未解決
トピックタグ
おみおみ
 おみおみ
(@おみおみ)
ゲスト
結合: 20年前
投稿: 20
Topic starter  

環境書き忘れました。
VC++.net MFC

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

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

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

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> あるコンストラクタから、別のコンストラクタを呼びたいのです。

許されていません。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

こういう場合、C++ では(可能なら)デフォルト引数を使ったりします。

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

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

こうなります。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

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


返信引用
REE
 REE
(@REE)
ゲスト
結合: 23年前
投稿: 240
 

>メンバ変数が消滅してるわけでもないのになぜデストラクタが呼ばれるのでしょうか?

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

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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

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


返信引用
おみおみ
 おみおみ
(@おみおみ)
ゲスト
結合: 20年前
投稿: 20
Topic starter  

皆様いろいろありがとうございます。
PATIOさんのおっしゃる方法でやろうと思います。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました