为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
米琪卡哇伊 2019-07-17 14:55:53
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;有什么想法吗?
查看完整描述

3 回答

?
弑天下

TA贡献1818条经验 获得超7个赞

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


查看完整回答
反对 回复 2019-07-17
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

class IDontControl{
    class Nested
    {
        Nested(int i);
    };};

我需要一个前瞻性的参考,比如:

class IDontControl::Nested; // But this doesn't work.

我的解决办法是:

class IDontControl_Nested; // Forward reference to distinct name.

稍后,当我可以使用完整的定义时:

#include <idontcontrol.h>// I defined the forward ref like this:class IDontControl_Nested : public IDontControl::Nested{
    // Needed to make a forwarding constructor here
    IDontControl_Nested(int i) : Nested(i) { }};

如果存在复杂的构造函数或其他无法顺利继承的特殊成员函数,这种技术可能会带来更大的麻烦。我可以想象某种模板魔法反应很糟糕。

但在我非常简单的例子中,它似乎奏效了。


查看完整回答
反对 回复 2019-07-17
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

如果您确实希望避免将讨厌的头文件包括在头文件中,可以这样做:

HPP档案:

class MyClass{public:
    template<typename ThrowAway>
    void doesStuff();};

CPP文件

#include "MyClass.hpp"#include "Annoying-3rd-party.hpp"template<> void MyClass::doesStuff<This::Is::An::Embedded::Type>(){
    // ...}

但随后:

  1. 您必须在调用时指定嵌入式类型(特别是如果您的函数不接受嵌入式类型的任何参数)
  2. 您的函数不能是虚拟的(因为它是一个模板)

所以,是的,权衡一下.


查看完整回答
反对 回复 2019-07-17
  • 3 回答
  • 0 关注
  • 306 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信