编辑:大道歉-我已经在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
类之后。