Подтвердить что ты не робот

Переменная С++ имеет инициализатор, но неполный тип?

Я пытаюсь скомпилировать 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;
}
4b9b3361

Ответ 1

Вы используете форвардное объявление, когда вам нужен полный тип.

У вас должно быть полное определение класса, чтобы использовать его.

Обычный способ сделать это:

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"

Ответ 2

Это не относится к делу Кена напрямую, но такая ошибка также может возникнуть, если вы скопировали файл .h и забыли изменить директиву #ifndef. В этом случае компилятор просто пропустит определение класса, думая, что это дублирование.

Ответ 3

Вы не можете определить переменную неполного типа. Вы должны привести все определение Cat в область видимости до того, как вы сможете создать локальную переменную в main. Я рекомендую вам переместить определение типа Cat в заголовок и включить его из единицы перевода, которая имеет main.

Ответ 4

Я получил аналогичную ошибку и ударил эту страницу во время поиска решения.

С Qt эта ошибка может произойти, если вы забудете добавить шаг QT_WRAP_CPP( ... ) в свою сборку для запуска метакомпонента (moc). Включение заголовка Qt недостаточно.