Cal*_*ius 189 c++ nested class forward-declaration
我最近遇到了这样的情况:
class A
{
public:
typedef struct/class {...} B;
...
C::D *someField;
}
class C
{
public:
typedef struct/class {...} D;
...
A::B *someField;
}
Run Code Online (Sandbox Code Playgroud)
通常你可以声明一个类名:
class A;
Run Code Online (Sandbox Code Playgroud)
但是你不能转发声明一个嵌套类型,以下导致编译错误.
class C::D;
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
Ada*_*eld 218
你不能这样做,这是C++语言的一个漏洞.您必须取消嵌套至少一个嵌套类.
Mar*_*Ray 32
class IDontControl
{
class Nested
{
Nested(int i);
};
};
Run Code Online (Sandbox Code Playgroud)
我需要一个前向引用,如:
class IDontControl::Nested; // But this doesn't work.
Run Code Online (Sandbox Code Playgroud)
我的解决方法是:
class IDontControl_Nested; // Forward reference to distinct name.
Run Code Online (Sandbox Code Playgroud)
后来我可以使用完整的定义:
#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) { }
};
Run Code Online (Sandbox Code Playgroud)
如果有复杂的构造函数或其他特殊成员函数没有顺利继承,那么这种技术可能会比它的价值更麻烦.我可以想象某些模板魔法反应很糟糕.
但在我非常简单的情况下,似乎有效.
小智 5
如果你真的想避免在你的头文件中#include 讨厌的头文件,你可以这样做:
hpp文件:
class MyClass
{
public:
template<typename ThrowAway>
void doesStuff();
};
Run Code Online (Sandbox Code Playgroud)
.cpp文件
class MyClass
{
public:
template<typename ThrowAway>
void doesStuff();
};
Run Code Online (Sandbox Code Playgroud)
但是之后:
所以,是的,权衡...