编辑: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) )
{
}
然后现在这很酷。我想了解问题是什么,如果第二种情况可以做,假设我负责所有析构函数和复制构造函数。
答案 0 :(得分:1)
这是重要的表达方式:
new gTime(1)
除非编译器知道gTime
类的接口,否则无法编译这行代码。例如,它需要查看它是否具有可以接受int
的构造函数或其他可以将1
作为单个参数的构造函数。
一种解决方案是将整个gTime
类移到文件的开头,在gUniverse
类之上。
或者,您可以将此new ...
移至gTime
下方的文件中。您通过将该定义移到类外并进入:
gUniverse::gUniverse():UniverseTime(new gTime(1) ) { }
但是,仅当您将其放在gTime
课程之后才有效。如果您只是在gUniverse
课程之后和gTime
课程之前放置了这个,那么这将无效。所以这不是关于内联与外部的关系 - 重要的是gUniverse
构造函数的这个定义必须在gTime
类之后。