Может ли класс C ++ включать себя в качестве члена? - PullRequest
38 голосов
/ 25 апреля 2010

Я пытаюсь ускорить процедуру Python, написав ее на C ++, а затем используя ctypes или cython.

Я новичок в C ++. Я использую Microsoft Visual C ++ Express, так как он бесплатный.

Я планирую реализовать дерево выражений и метод для его оценки в порядке постфикса.

Проблема, с которой я столкнулся сразу:

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

Я не могу объявить left или right как Node типы.

Ответы [ 4 ]

82 голосов
/ 25 апреля 2010

Нет, потому что объект будет бесконечно большим (потому что каждый 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
};
33 голосов
/ 18 января 2014

Просто для полноты обратите внимание, что класс может содержать статический экземпляр самого себя:

class A
{
    static A a;
};

Это потому, что статические члены на самом деле не хранятся в экземплярах класса, поэтому рекурсия отсутствует.

10 голосов
/ 25 апреля 2010

Нет, но он может иметь ссылку или указатель на себя:

class Node
{
    Node *pnode;
    Node &rnode;
};
1 голос
/ 04 сентября 2018

Вы должны использовать указатель, и лучше инициализировать:

class Node {
    char * cargo = nullptr;
    Node * left = nullptr;
    Node * right = nullptr;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...