编辑:大道歉-我已经在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) )
   {
   }


那么,现在一切都很酷。考虑到我要处理所有析构函数和复制构造函数,因此我想了解问题所在以及第二种情况是否可以解决。

最佳答案

这是重要的表达:

new gTime(1)


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

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

或者,您可以将此new ...移动到文件中gTime下的更高版本。您是通过将该定义移至类之外并移至以下方式来完成此操作的:

gUniverse::gUniverse():UniverseTime(new gTime(1) )    {   }


但是,只有将其放在gTime类之后,此方法才有效。如果您只是将其放置在gUniverse类之后和gTime类之前,则此方法将无效。因此,这实际上不是内联还是外部的-重要的是gUniverse构造函数的定义必须在gTime类之后。

07-25 22:58