c ++类可以将自己包含为成员吗?

Pet*_*art 41 c++

我试图通过在C++中编写python例程来加速它,然后使用ctypes或cython来使用它.

我是c ++的新手.我正在使用Microsoft Visual C++ Express,因为它是免费的.

我计划实现一个表达式树,以及一个以后缀顺序评估它的方法.

我遇到的问题是:

class Node {
    char *cargo;
    Node left;
    Node right;
};
Run Code Online (Sandbox Code Playgroud)

我无法宣布leftright作为Node类型.

Jam*_*lis 85

没有,因为对象将是无限大(因为每一个Node有作为成员另外两个Node对象,每个有作为成员另外两个Node对象,每......好吧,你明白了吧).

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

class Node {
    char *cargo;
    Node* left;   // I'm not a Node; I'm just a pointer to a Node
    Node* right;  // Same here
};
Run Code Online (Sandbox Code Playgroud)


小智 36

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

class A
{
    static A a;
};
Run Code Online (Sandbox Code Playgroud)

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

  • @hymced:不,`A`的实例都不包含指针,当然也没有指向静态成员的指针。`->`和`.`将使您得到该对象,这要归功于名称查找规则,而不是因为任何内存布局。 (3认同)

R S*_*hko 11

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

class Node
{
    Node *pnode;
    Node &rnode;
};
Run Code Online (Sandbox Code Playgroud)

  • 您可以创建一个虚拟节点来采取NULL的步伐.但是,这不能很好地工作,因为引用不能重新分配给其他东西,并且修改任何链接都需要重建所有节点到根. (4认同)
  • 在这种情况下引用并不真正起作用,因为它们不允许为空,并且您需要空结尾或图形将是无限的. (2认同)
  • @Blindy:您还可以将节点引用设置为“*this”而不是 NULL。 (2认同)