Can a c++;类是否将自身包含为成员? 我试图通过在C++中编写Python程序,然后使用cType或Cython来使用它。 我对C++是全新的。我使用微软Visual C++快件,因为它是免费的。

Can a c++;类是否将自身包含为成员? 我试图通过在C++中编写Python程序,然后使用cType或Cython来使用它。 我对C++是全新的。我使用微软Visual C++快件,因为它是免费的。,c++,C++,我计划实现一个表达式树,以及一个按照后缀顺序对其求值的方法 我马上遇到的问题是: class Node { char *cargo; Node left; Node right; }; 我不能将左或右声明为节点类型。否,因为对象将无限大(因为每个节点都有另外两个节点对象作为成员,每个对象都有另外两个节点对象作为成员,每个对象……好吧,你明白了) 但是,您可以将指向类类型的指针作为成员变量: class Node { char *cargo; Node*

我计划实现一个表达式树,以及一个按照后缀顺序对其求值的方法

我马上遇到的问题是:

class Node {
    char *cargo;
    Node left;
    Node right;
};

我不能将
声明为
节点
类型。

否,因为对象将无限大(因为每个
节点
都有另外两个
节点
对象作为成员,每个对象都有另外两个
节点
对象作为成员,每个对象……好吧,你明白了)

但是,您可以将指向类类型的指针作为成员变量:

class Node {
    char *cargo;
    Node* left;   // I'm not a Node; I'm just a pointer to a Node
    Node* right;  // Same here
};

否,但它可以有一个指向自身的引用或指针:

class Node
{
    Node *pnode;
    Node &rnode;
};

为了完整起见,请注意类可以包含自身的静态实例:

class A
{
    static A a;
};

这是因为静态成员实际上并不存储在类实例中,因此不存在递归。

您应该使用指针,最好初始化:

class Node {
    char * cargo = nullptr;
    Node * left = nullptr;
    Node * right = nullptr;
};

在这种情况下,引用实际上不起作用,因为它们不允许为null,并且您需要null结尾,否则图形将是无限的。您可以创建一个伪节点以适应null的速度。但是,这不起作用,因为无法将引用重新分配给其他对象,对任何链接的修改都需要将所有节点重建到根节点。@Blindy:您也可以将节点引用设置为
*this
而不是NULL。@Blindy,@all:是。就像我说的,我是一个真正的初学者。我一直很难把这些放在一起。@Blindy,但有
std::optional
!别笑。抛出if'null'更容易,而且不太容易出现意外的指针运算之类的情况。这让我有点头晕目眩,所以我想补充一点:在这种情况下,类'a'的每个实例将只存储一个指向在静态内存中为特定'a'实例分配的空间的指针。因此,“a”实例也有一个指针,它无限指向自身:
a*someA=newa
someA->.a.a.a…等。
(假设“a”是公共属性),这就是为什么内存在有限内存中使用。@hymced:不,没有一个
a
的实例包含指针,当然没有指向静态成员的指针
->
将获得该对象,这要归功于名称查找规则,而不是因为任何内存布局。@Lightness Races in Orbit您是对的,上面的示例中没有指针。我的意思是使用的内存是有限的,不是因为静态成员存储在类实例之外,而是因为这个特定的静态成员对于任何类实例都是相同的。这也是因为“a”实例只包含自身,而不包含其他内容。如果在混合中添加一个简单的(非静态)int成员,即使有一个静态类成员,内存也会不足。@这根本不是真的。为什么你认为在
a
中添加一个非
static
成员会导致计算机内存不足?同样,我错了:“a”的int成员(不在静态内存中)与“a”(在静态内存中)不同,但“a”的int成员与“a.a”相同(因为“a.a”是“a”),与“a.a.a”相同,所以使用的内存是有限的。“我不能将left或right声明为节点类型。”这应该包括对原因的解释,并逐字引用收到的任何错误。您的编译器可能会抱怨
节点
在当时是一个不完整的类型。在这种情况下,裸指针是正确和直观的选择。值得一提的是,让自己成为会员可以使用其他选择,例如:
reference
std::unique_ptr
std::shared_ptr
std::weak_ptr
,另请参见: