web-dev-qa-db-ja.com

C ++変数には初期化子がありますが、型が不完全ですか?

次のコマンドを使用して、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;
}
46
user569322

完全な型が必要な場合は、前方宣言を使用します。

クラスを使用するには、クラスの完全な定義が必要です。

これに関する通常の方法は次のとおりです。

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.cppCat.cppの両方に含めます:

#include "Cat_main.h"
42
Luchian Grigore

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

9

不完全な型の変数を定義することはできません。 Catの定義全体をスコープに取り込む必要がありますbeforemainにローカル変数を作成できます。タイプCatの定義をヘッダーに移動し、mainを持つ変換ユニットから含めることをお勧めします。

同様のエラーが発生し、ソリューションの検索中にこのページにアクセスしました。

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

1
peter karasev

時々forget to include the corresponding header

0
xtluo