C++ C++;:如何使用尚未定义的类型?
C++要求所有类型在使用之前都必须定义,这使得以正确的顺序包含头文件非常重要。好的但我的情况如何:C++ C++;:如何使用尚未定义的类型?,c++,header,declaration,forward-declaration,C++,Header,Declaration,Forward Declaration,C++要求所有类型在使用之前都必须定义,这使得以正确的顺序包含头文件非常重要。好的但我的情况如何: Bunny.h: class Bunny { ... private: Reference<Bunny> parent; } 编辑:这很好,问题出在其他方面。非常感谢你的帮助 如果Reference具有T类型的变量,则T不能具有Reference类型的变量。您可以选择重写Reference,或者重写Bunny以使用指向Reference的指
Bunny.h
:
class Bunny
{
...
private:
Reference<Bunny> parent;
}
编辑:这很好,问题出在其他方面。非常感谢你的帮助 如果Reference
具有T
类型的变量,则T
不能具有Reference
类型的变量。您可以选择重写Reference
,或者重写Bunny
以使用指向Reference
的指针:
模板类参考;
班兔
{
...
私人:
参考*父母;
}
问题的答案取决于引用的外观。如果它有一个类型为Bunny的实例变量,那么它当然不会工作(怎么会呢,你有一个永远不会结束的递归定义)。如果它只有引用和指针,那么它应该可以正常工作。模板实例化中的Bunny类型不会对此产生干扰
编辑(后参考代码编辑):
我似乎无法重现你的问题。我已经像您正在做的那样重新实现了代码,但它对我来说编译得很好:
struct base {
void fun() {}
};
template < typename T >
struct temp
{
T * t;
void f() { ((base*)t)->fun(); }
};
struct test
{
temp<test> t;
};
int main()
{
test t;
t.t.f();
}
struct base{
void fun(){}
};
模板
结构温度
{
T*T;
void f(){((base*)t)->fun();}
};
结构测试
{
温度t;
};
int main()
{
试验t;
t、 t.f();
}
这显然是无效的代码,因为您将获得未定义的结果,但它确实可以编译。这里的主要问题是从类型测试*到类型基*的重新解释转换。如果测试真的从基础继承,那么演员阵容就没有必要了。像这样的代码不会像预期的那样工作,但它应该编译得很好。我的一个建议是丢掉所有的c风格演员。但这并不能解决您遇到的问题,不管它是什么……它必须在您不粘贴的代码中的某个地方。这不只是一个抽象的问题吗,抽象成为问题的解决方案?我会考虑创建一个接口,<代码> iBunn,然后在实现<代码> iBunny/Cult>的任何定义中使用<代码>引用< /代码>。p>
这是为接口而发明的用例之一(在典型的GoF创作模式中很方便)。你能发布你的参考类吗?是的。它本质上是一个智能指针。对于我来说,它在VS2008中编译得很好。编译器输出是什么?不需要。正如@Noah所说,他有一个递归定义。谢谢!这是另外一回事,我做出了错误的假设。
template<class> class Reference;
class Bunny
{
...
private:
Reference<Bunny>* parent;
}
struct base {
void fun() {}
};
template < typename T >
struct temp
{
T * t;
void f() { ((base*)t)->fun(); }
};
struct test
{
temp<test> t;
};
int main()
{
test t;
t.t.f();
}