Переменная С++ имеет инициализатор, но неполный тип?
Я пытаюсь скомпилировать 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
Вы используете форвардное объявление, когда вам нужен полный тип.
У вас должно быть полное определение класса, чтобы использовать его.
Обычный способ сделать это:
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 недостаточно.