Почему встроенный не работает здесь?

0

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) )
   {
   }

Тогда все это круто. Я хочу понять, в чем проблема, и если второй случай подходит, учитывая, что я забочусь обо всех деструкторах и конструкторах копирования.

Теги:
constructor

1 ответ

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.

  • 0
    о, да, это имеет смысл. Может ли наличие файла .h помочь с этими проблемами? Вместо этого я объявил все мои классы в начале файла cpp.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню