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等等.
| 归档时间: |
|
| 查看次数: |
34052 次 |
| 最近记录: |