C++嵌套类/转发声明问题

uj2*_*uj2 32 c++ nested-class forward-declaration

是否可以转发声明一个嵌套类,然后将其用作外部类的具体(不是指向/引用)数据成员的类型?

IE

class Outer;

class Outer::MaybeThisWay   // Error: Outer is undefined
{
};

class Outer
{
 MaybeThisWay x;

 class MaybeThatOtherWay;

 MaybeThatOtherWay y;   // Error: MaybeThatOtherWay is undefined
};
Run Code Online (Sandbox Code Playgroud)

jan*_*nks 37

你不能像这样前向声明一个嵌套类.

根据您要执行的操作,也许您可​​以在外层使用命名空间而不是类.你可以向前声明这样一个类没问题:

namespace Outer {
   struct Inner; 
};

Outer::Inner* sweets;  // Outer::Inner is incomplete so 
                       // I can only make a pointer to it
Run Code Online (Sandbox Code Playgroud)

如果你的Outer绝对必须是一个类,并且你不能将它变成一个命名空间,那么你需要在你转发声明Inner的上下文中成为一个完整的类型.

class Outer
{
   class Inner;  // Inner forward-declared
};  // Outer is fully-defined now

Outer yes;  // Outer is complete, you can make instances of it
Outer::Inner* fun;  // Inner is incomplete, you can only make 
                    // pointers/references to it

class Outer::Inner 
{
};  // now Inner is fully-defined too

Outer::Inner win;  // Now I can make instances of Inner too
Run Code Online (Sandbox Code Playgroud)


def*_*ode 15

如果没有完全指定包含类,则无法转发声明嵌套类.这个小技巧有点解决了这个问题

class Outer_Inner
{
};

class Outer
{
public:
   typedef Outer_Inner Inner;
};
Run Code Online (Sandbox Code Playgroud)

这对我有用,因为我的命名约定Outer_Inner不是有效的类名,所以很明显它引用了一个嵌套类.

您仍然无法转发声明嵌套类,如下所示:

class Outer::Inner;
Run Code Online (Sandbox Code Playgroud)

但至少它可以向前宣布:

class Outer_Inner;
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢Outer_Inner看起来的方式,您可以采用更适合您口味的嵌套类的命名约定. Outer__Inner,Outer_nested_Inner等等.

  • 不要使用双下划线 - 包含两个下划线的名称保留给实现以供任何使用.请参见http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier/228797#228797 (3认同)

归档时间:

查看次数:

34052 次

最近记录:

9 年,10 月 前