c ++如何创建一个使用自己类型变量的类

时间:2014-04-19 07:57:41

标签: c++ pointers

我正在尝试创建一个包含它自己类型的变量的类,并且遇到了问题。这就是我想做的事情:

Class myClass
{
    private:
        myClass a, b;
    public:
        void myFunctionA()
        {
            SomeOtherClass.somePointerToMap = &a;
        }

        void myFunctionB()
        {
            SomeOtherClass.somePointerToMap = &b;
        }
};

任何帮助都表示赞赏,对于基于文本的游戏来说,如果我无法让这个游戏发挥作用,则需要100个if语句来移动玩家。

4 个答案:

答案 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
    ....
    }