Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

スタック上に確保するクラスのインスタンス化のやり方について

スポンサードリンク


スタック上に確保するクラスのインスタンス化の場合()丸カッコ有の場合エラーになるのはなんでなの?という話。
C++でRAII(Resource Acquisition Is Initialization)とかしようとしたときに
スタック上にクラスをインスタンス化することがあって

{
    HogeClass hogeClass;
    hoge();
    fuga();
}    // ここで自動的にデストラクト

とかやってかと思うんですけど、
他にも、
例が悪いですがMFCのような例だと

class CFooApp : public CWinApp
{
public:
  virtual void InitInstance();
  virtual void Run();
};

void CFooApp::InitInstance()
{ 
    bar(); 
}

void CFooApp::Run()
{
    baz();
}

CFooApp theApp;   // Instaitiation OK
CFooApp theApp(); // Instantiation NG

っていうのがありますね。スタックに確保しようとしたときに
カッコを付けるとエラーになるってやつ。
newのときは問題にならないのですが。
長年悩んでました。この違いってなんなの?って。

もうチョイわかりやすい例を。

#include <iostream>
using namespace std;

class CTest 
{
private:
    int x;
public:
    CTest()
    { 
       x = 3;
       cout << "A"; 
    }
};

int main () {
   CTest t1;       // OK
   CTest t2();     // NG
    return 0;
}

そう、この問題ってググりにくいんですよね。
なんでかっこあるとダメなのか。
日本語で探すもたどり着けず、
ってことで、
c++ constructor stack bracket
で検索したらイケました!
さすが僕らの味方stack overflow
そういやstack overflowの日本語版ができるって話がありましたが
どうなったんでしょうね。
下記に解答が書いてあります。
簡単にいうと…
それって関数定義と区別つかないんだよね。
パースがク○だ!忌々しいぜ!!
俺に彼女ができないのも忌々しいぜ(アメリカ人男性 独身35歳)[妄想]
っていうような内容でした。
はっ!!そうだ!関数定義と区別つかねぇ!!!!
って気づいてませんでした。
今まで…なんでそんなことに気付かなかったんだろう……orz
でもさ……

HogeClass hogeClass(100);

とかはOKなんだよな。
まぁ、これはプロトタイプ宣言と被ることないから
大丈夫か。ってことかい。
プログラマなら英語が読めなくても
提示されているコードでわかると思います。
c++ - Default constructor with empty brackets - Stack Overflow
c++ - Instantiate class with or without parentheses? - Stack Overflow
前者ではvectorのコンストラクタの例で問題になるケースを上げて
workaround(その場しのぎの回避手段的なものって意味です)を書いてくれてます。

探しにくかったら英語で探せば見つかりやすいと知りました(*´Д`)!