Edit: Big Aplogies. У меня было gTime, объявленное после gUniverse, но отправило его здесь неправильно после того, как его попросили предоставить больше кода. Я перепутал его с более ранней версией моей программы, где на самом деле все было наоборот.
У меня есть класс gUniverse, который содержит объявление aa указателя на экземпляр другого объекта класса gTime;
class gUniverse;
class gTime;
class gUniverse
{
public:
gUniverse():UniverseTime(new gTime(1) ){}
~gUniverse();
gTime* UniverseTime;
};
class gTime
{
public:
gTime();
gTime(int start);
void StartTimer();
double ElapsedTime();
private:
clock_t StartTime;
clock_t StopTime;
};
Это не скомпилировано с "неполным типом".
Однако, когда я делаю внешнюю декларацию, то есть:
class gUniverse
{
public:
gUniverse();
~gUniverse();
gTime* UniverseTime;
};
gUniverse::gUniverse():UniverseTime(new gTime(1) )
{
}
Тогда все это круто. Я хочу понять, в чем проблема, и если второй случай подходит, учитывая, что я забочусь обо всех деструкторах и конструкторах копирования.
Это важное выражение:
new gTime(1)
Эта строка кода не может быть скомпилирована, если компилятор не знает интерфейс для класса gTime
. Например, он должен видеть, имеет ли он конструктор, который может принять int
или какой-либо другой конструктор, который может принимать 1
как один аргумент.
Одним из решений является перемещение всего класса gTime
ближе к началу файла над классом gUniverse
.
Кроме того, вы можете переместить этот new...
позже в файл ниже gTime
. Вы сделали это, переместив это определение вне класса и в:
gUniverse::gUniverse():UniverseTime(new gTime(1) ) { }
Однако это работает, только если вы разместите его после класса gTime
. Если вы просто разместили это после класса gUniverse
и перед классом gTime
, это не сработает. Таким образом, это не относится к inline versus external - важно то, что это определение конструктора gUniverse
должно быть после класса gTime
.