スタック上に確保するクラスのインスタンス化の場合()丸カッコ有の場合エラーになるのはなんでなの?という話。
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(その場しのぎの回避手段的なものって意味です)を書いてくれてます。
探しにくかったら英語で探せば見つかりやすいと知りました(*´Д`)!