Переменная 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). Вот мой исходный код: Кот.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;
}
4 ответов:
Вы используете прямое объявление, когда вам нужен полный тип.
Вы должны иметь полное определение класса, чтобы использовать его.
Обычный способ сделать это:
1) создайте файл
Cat_main.h2) перемещение
От#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"
Это не имеет прямого отношения к делу Кена, но такая ошибка также может произойти, если вы скопировали .h файл и забыл изменить директиву
#ifndef. В этом случае компилятор просто пропустит определение класса, думая, что это дублирование.
Невозможно определить переменную неполного типа. Вам нужно привести все определение
Catв область , прежде чем Вы сможете создать локальную переменную вmain. Я рекомендую вам переместить определение типаCatв заголовок и включить его из единицы перевода, которая имеетmain.
Я получил аналогичную ошибку и попал на эту страницу при поиске решения.
С Qt эта ошибка может произойти, если вы забудете добавить Шаг
QT_WRAP_CPP( ... )в свою сборку для запуска компилятора meta object compiler (moc). Включение заголовка Qt недостаточно.
Comments