我正在尝试创建一个包含它自己类型的变量的类,并且遇到了问题。这就是我想做的事情:
Class myClass
{
private:
myClass a, b;
public:
void myFunctionA()
{
SomeOtherClass.somePointerToMap = &a;
}
void myFunctionB()
{
SomeOtherClass.somePointerToMap = &b;
}
};
任何帮助都表示赞赏,对于基于文本的游戏来说,如果我无法让这个游戏发挥作用,则需要100个if语句来移动玩家。
答案 0 :(得分:3)
你不能那样做,因为
1)拥有一个类型的实例要求类型完整,并且只有在其定义的右大括号之后才完成一个类。
2)持有自身实例的类将无限大。
您需要存储指针或对myClass
的引用。
答案 1 :(得分:1)
类的大小至少为一个字节。
但是如果一个类包含两个自身副本,那么它必须至少有两个字节。
但是如果它至少有两个字节(并且包含两个自身的副本)那么它必须至少有四个字节。
但是如果它至少有四个字节(并且包含两个自身的副本)那么它必须至少有八个字节。
...依此类推......: - )
您可以拥有一个类,该类包含对同一个类的实例的两个REFERENCES:
struct X {
int x;
X &a, &b;
X(int x, X& a, X& b) : x(x), a(a), b(b) {}
};
构建第一个实例并不简单,因为引用必须在构造函数中设置,以后不能更改。仍然可以建立一个带有一些技巧的网络......例如
extern X x1;
extern X x2;
extern X x3;
X x1(1, x2, x3);
X x2(2, x3, x1);
X x3(3, x1, x2);
之后x1.a.b.a.a.b.b.a.b.a.a.a.b.a.x
为1。
您最终可以拥有一个包含POINTERS的类到同一个类的实例。这是一种非常常见的模式(例如对于二叉树):
struct Node {
int value;
Node *left, *right;
Node(int value, Node *left, Node *right)
: value(value), left(left), right(right)
{}
};
指针的优点是你不必强制指定一个实例(你可以使用空指针代替),并且你也可以稍后改变指针指向的内容。不幸的是,语法有点烦人(需要->
)。
另一个非常简单的选项(但它仅适用于树而不适用于任意拓扑)是一个包含同一类实例容器的类,例如:
struct Node {
int x;
std::vector<Node> children;
Node(int x) : x(x) {}
};
这是有效的,因为children
容器也可能为空(因此大小不会爆炸到无穷大),并且内部使用指针进行管理。
答案 2 :(得分:0)
您需要一个前向声明,而表示递归类型的类必须使用指针:
class myClass
{
private:
myClass* a;
myClass* b;
答案 3 :(得分:0)
如果要创建自己类型的变量,则只能创建指针。正常变量(非指针)是完整类型,您无法在“自己的类型”中创建。指针是不完整的类型。
允许遵循,
Class myClass
{
private:
myClass *a, *b;//incomplete type
....
}
但这是不可能的,
Class myClass
{
private:
myClass a, b;//complete type
....
}