次のコマンドを使用して、C++で2つのクラスをコンパイルしようとしています。
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)ファイルCat_main.h
を作成します
2)移動
#include <string>
class Cat
{
public:
Cat(std::string str);
// Variables
std::string name;
// Functions
void Meow();
};
Cat_main.h
に。ヘッダー内でusing namespace std;
とstd::string
で修飾された文字列を削除したことに注意してください。
3)このファイルをCat_main.cpp
とCat.cpp
の両方に含めます:
#include "Cat_main.h"
Kenのケースとは直接関係ありませんが、。hファイルをコピーして変更を忘れた場合にも、このようなエラーが発生する可能性があります#ifndef
ディレクティブ。この場合、コンパイラーは、重複していると考えてクラスの定義をスキップします。
不完全な型の変数を定義することはできません。 Cat
の定義全体をスコープに取り込む必要がありますbeforemain
にローカル変数を作成できます。タイプCat
の定義をヘッダーに移動し、main
を持つ変換ユニットから含めることをお勧めします。
同様のエラーが発生し、ソリューションの検索中にこのページにアクセスしました。
Qtでは、ビルドにQT_WRAP_CPP( ... )
ステップを追加してメタオブジェクトコンパイラ(moc)を実行するのを忘れると、このエラーが発生する可能性があります。 Qtヘッダーを含めるだけでは不十分です。
時々、forget to include the corresponding header
。