为什么内联在这里不起作用?

时间:2013-10-11 16:46:34

标签: c++ constructor

编辑:Big Aplogies - 我已经在gUniverse之后声明了gTime,但是在被要求提供更多代码之后在这里发布了错误。我把它与我的程序的早期版本混淆了,实际上它是相反的。

我有一个类gUniverse,它包含一个指向类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) )
   {
   }

然后现在这很酷。我想了解问题是什么,如果第二种情况可以做,假设我负责所有析构函数和复制构造函数。

1 个答案:

答案 0 :(得分:1)

这是重要的表达方式:

new gTime(1)

除非编译器知道gTime类的接口,否则无法编译这行代码。例如,它需要查看它是否具有可以接受int的构造函数或其他可以将1作为单个参数的构造函数。

一种解决方案是将整个gTime类移到文件的开头,在gUniverse类之上。

或者,您可以将此new ...移至gTime下方的文件中。您通过将该定义移到类外并进入:

来实现此目的
gUniverse::gUniverse():UniverseTime(new gTime(1) )    {   }

但是,仅当您将其放在gTime课程之后才有效。如果您只是在gUniverse课程之后和gTime课程之前放置了这个,那么这将无效。所以这不是关于内联与外部的关系 - 重要的是gUniverse构造函数的这个定义必须在gTime类之后。