2009-04-02 35 views
23

私は私のクラスのコンストラクタとデストラクタを定義しようとしているが、私はエラーを得続けるに関連するエラーをコンパイル:C++のコンストラクタ/デストラクタの定義

definition of implicitly-declared 'x::x()'

それが何を意味するのでしょうか?コンパイラはあなたドンを知っているように

class StackInt { 
public: 
    StackInt(); 
    ~StackInt(); 
} 

:コードの

パート:(おそらく、ヘッダー・ファイル内の)クラス宣言では、のように見えるものを持って

///Constructor 
StackInt::StackInt(){ 
    t = (-1); 
    stackArray = new int[20]; 
}; 

///Destructor 
StackInt::~StackInt(){ 
    delete[] stackArray; 
} 
+0

ファイルはどのように構造化されていますか(* .h、* .cpp)?投稿されたコードはどのファイルですか? – paxdiablo

答えて

43

が必要あなたがそれらを提供しているので、デフォルトのコンパイラ生成バージョンを望んでいません。

おそらくそれ以上の宣言はありますが、少なくともそれらは必要です。これが始めることになります。

あなたは非常に単純なを使用してこれを見ることができます:

class X { 
     public: X(); // <- remove this. 
}; 
X::X() {}; 
int main (void) { X x ; return 0; } 

はそれをコンパイルし、それが動作します。その後、コメントマーカーを含む行を削除し、再度コンパイルします。あなたは、あなたの問題は、その後、表示されます:

class X {}; 
X::X() {}; 
int main (void) { X x ; return 0; } 

 
qq.cpp:2: error: definition of implicitly-declared `X::X()' 

+0

ありがとうございます。これはまさに問題でした。 –

+0

@ MB、私はあなたが答えている間、テストプログに取り組んでいたので、私は同じことを言った競合する答えを作るよりも、それを追加すると思った。それから私はあなたのはるかに良い答えをupvoted :-) – paxdiablo

+0

簡潔で正確...非常によく行わ。 – ojblass

1

心に留めておくべきもう一つは、コンストラクタがアクセスし、すべてがパブリックでなければならないということです。私は前にこのエラーを受けました。私のコンストラクタで、私は次のように持っていたので

class X{ 
    T *data; 
public:  // <-move this to include T * 
    X(); 
    ~X(); 
} 

このコードはまだエラーを持っている:

X::X(){data = new T(); 

私は、コンストラクタとデストラクタ公開されていたが、彼らが働いていたデータがまだあったことを意味し、どの私はまだ暗黙に宣言されたエラーの定義を持っています。

+1

これはまったく正しくありません。コンストラクタは任意のプライベートメンバ変数にアクセスすることができ、そうするためには通常、その仕事の大部分です。 –

+0

はい、コンストラクタはプライベートメンバ変数にアクセスできますが、**独自のクラスのみにアクセスできます**これは、コンストラクタがT *データのプライベート変数にアクセスしたい場合、publicでなければならないことを意味します。 – taronish4