2012-03-19 12 views
37

私は、次のコマンドを使用してC++で2クラスをコンパイルしようとしています:C++変数に初期化子がありますが、型が不完全ですか?

g++ Cat.cpp Cat_main.cpp -o Cat

しかし、私は、次のエラーが表示さ:

Cat_main.cpp:10:10: error: variable ‘Cat Joey’ has initializer but incomplete type

誰かがこれは何を意味するのか私に説明してもらえますか?私のファイルは基本的にはクラス(Cat.cpp)を作成し、インスタンス(Cat_main.cpp)を作成することです。ここに私のソースコードは次のとおりです。

Cat.cpp:

#include <iostream> 
#include <string> 

class Cat; 

using namespace std; 

int main() 
{ 
    Cat Joey("Joey"); 
    Joey.Meow(); 

    return 0; 
} 

Cat_main.cpp:

#include <iostream> 
#include <string> 

using namespace std; 

class Cat 
{ 
    public: 
     Cat(string str); 
    // Variables 
     string name; 
    // Functions 
     void Meow(); 
}; 

Cat::Cat(string str) 
{ 
    this->name = str; 
} 

void Cat::Meow() 
{ 
    cout << "Meow!" << endl; 
    return; 
} 
+1

まだ定義されていないクラスのオブジェクトは宣言できません。 – iammilind

+0

どのように表示するのですか? –

+3

@Ken:ヘッダファイルをインクルードする必要があります。 –

答えて

33

あなたは完全な型を必要とするときは、前方宣言を使用しています。

クラスを完全に定義して使用する必要があります。

これについて移動する通常の方法は次のとおりです。

1)ファイルCat_main.h

2を作成する)Cat_main.h

#include <string> 

class Cat 
{ 
    public: 
     Cat(std::string str); 
    // Variables 
     std::string name; 
    // Functions 
     void Meow(); 
}; 

を移動します。ヘッダーの内側ではusing namespace std;を削除し、修飾された文字列をstd::stringで削除しました。

3)Cat_main.cppCat.cppの両方でこのファイルを含める:

#include "Cat_main.h" 
+0

クラス定義を別のファイルに投げることはできません。 –

+0

@Kenいいえ、それは私が言ったことではありません。答えをもう一度読んでください。 –

+0

ヘッダーファイルにクラスの関数も定義しますか? –

4

あなたが不完全な型の変数を定義することはできません。 mainにローカル変数を作成できるようにするには、Catの定義全体をにする必要があります。の前に、タイプCatの定義をヘッダーに移動し、mainの翻訳単位からインクルードすることをお勧めします。

+0

私は 'cat'クラスを' main'ファイルに入れなければなりませんか? –

+4

@Ken:いいえ、ヘッダーとソースファイルの概念を説明するC++の入門書を読んでおく必要があります。 –

+1

@Ken:クラス(および適切なガード)の定義を含むヘッダファイルを作成し、cat.cppとcat_main.cppの両方からインクルードします。 –

9

それは直接ケンのケースに関連していないですが、あなたはの.hファイルをコピーして#ifndefディレクティブを変更するのを忘れた場合、このようなエラーが発生することもあります。この場合、コンパイラはクラスの定義をスキップして重複していると考えます。

+1

優秀なコメント、私はそれが問題の最も頻繁な原因をカバーしていると思います。ヘッダファイルのコピーや名前の変更、#ifndef疑似命令の忘れが厄介ですが、その他の答えは些細な間違いである#include文の追加を忘れるためです。 – Vlad

1

解決方法を検索しているときにも同様のエラーが表示され、このページが表示されます。

Qtでは、QT_WRAP_CPP(...)ステップをビルドに追加して、メタオブジェクトコンパイラ(moc)を実行することを忘れた場合にこのエラーが発生する可能性があります。 Qtヘッダーを含めるだけでは不十分です。

関連する問題