0

编辑: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) )
   {
   }

那么现在这一切都很酷。我想了解问题出在哪里,如果第二种情况可以做,因为我负责所有的析构函数和复制构造函数。

4

1 回答 1

1

这是重要的表达:

new gTime(1)

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

一种解决方案是将整个gTime类移动到更靠近文件开头的gUniverse类上方。

或者,您可以将其移到new ...文件后面的gTime. 您通过将该定义移到类之外并进入:

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

但是,这仅在您将其放在gTime课程之后才有效。如果您只是将它放在gUniverse课后和课前gTime,那么这将行不通。所以这实际上并不是关于内联与外部的——重要的是gUniverse构造函数的这个定义必须在gTime类之后。

于 2013-10-11T17:33:08.513 回答