猿问

C+中嵌套类型/类的前向声明

C+中嵌套类型/类的前向声明

我最近陷入了这样的境地:

class A{public:
    typedef struct/class {...} B;...
    C::D *someField;}class C{public:
    typedef struct/class {...} D;...
    A::B *someField;}

通常您可以声明一个类名:

class A;

但是您不能转发声明嵌套类型,以下情况会导致编译错误。

class C::D;

有什么想法吗?


米琪卡哇伊
浏览 336回答 3
3回答

弑天下

你不能这么做,这是C+语言中的一个漏洞。您必须至少嵌套一个嵌套类。

尚方宝剑之说

class&nbsp;IDontControl{ &nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;Nested &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nested(int&nbsp;i); &nbsp;&nbsp;&nbsp;&nbsp;};};我需要一个前瞻性的参考,比如:class&nbsp;IDontControl::Nested;&nbsp;//&nbsp;But&nbsp;this&nbsp;doesn't&nbsp;work.我的解决办法是:class&nbsp;IDontControl_Nested;&nbsp;//&nbsp;Forward&nbsp;reference&nbsp;to&nbsp;distinct&nbsp;name.稍后,当我可以使用完整的定义时:#include&nbsp;<idontcontrol.h>//&nbsp;I&nbsp;defined&nbsp;the&nbsp;forward&nbsp;ref&nbsp;like&nbsp;this:class&nbsp;IDontControl_Nested&nbsp;:&nbsp;public&nbsp;IDontControl::Nested{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Needed&nbsp;to&nbsp;make&nbsp;a&nbsp;forwarding&nbsp;constructor&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;IDontControl_Nested(int&nbsp;i)&nbsp;:&nbsp;Nested(i)&nbsp;{&nbsp;}};如果存在复杂的构造函数或其他无法顺利继承的特殊成员函数,这种技术可能会带来更大的麻烦。我可以想象某种模板魔法反应很糟糕。但在我非常简单的例子中,它似乎奏效了。

ABOUTYOU

如果您确实希望避免将讨厌的头文件包括在头文件中,可以这样做:HPP档案:class&nbsp;MyClass{public: &nbsp;&nbsp;&nbsp;&nbsp;template<typename&nbsp;ThrowAway> &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;doesStuff();};CPP文件#include&nbsp;"MyClass.hpp"#include&nbsp;"Annoying-3rd-party.hpp"template<>&nbsp;void&nbsp;MyClass::doesStuff<This::Is::An::Embedded::Type>(){ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;...}但随后:您必须在调用时指定嵌入式类型(特别是如果您的函数不接受嵌入式类型的任何参数)您的函数不能是虚拟的(因为它是一个模板)所以,是的,权衡一下.
随时随地看视频慕课网APP
我要回答