Указатель данных члена инициализируется в куче

У меня есть класс Node и класс NodeManager. Объекты NodeManager содержат указатель на узел. Я хочу, чтобы этот указатель узла указывал на объект узла, который размещен в куче. Распределение кучи происходит в NodeManager.init(),

Вот код

class Node
{
public:
    int index;
};

class NodeManager
{
public:
    NodeManager() {}
    void initNode(Node *b)
    {
        b = new Node();
    }

    Node *node;
};

int main()
{
    NodeManager manager;
    manager.initNode(manager.node);

    cout << manager.node << endl; //prints a bad pointer

    system("pause");
    return 0;
}

Конечно когда меняюсь initNode() чтобы:

void initNode()
{
    this->node = new Node();
}

manager объект на самом деле "помнит" его nodeадрес. Проблема в том, что в первом коде адрес не запоминается, и приложение выводит неверный адрес. Это почему?

Редактировать: чтобы прояснить ситуацию, я работаю с классом, который имеет член данных, который является указателем на объект. Мой класс имеет рекурсивную функцию-член, которая принимает указатель на член данных в качестве параметра "начальной точки" и продолжает вызывать себя для выделения и создания "потомков" объекта. Но тогда я получаю эту проблему. элемент приватных данных не запоминается и в конце концов оказывается NULL или плохим указателем.

1 ответ

Решение

Проблема в том, что вы пытаетесь изменить значение указателя, но передаете его по значению. Как следствие, это копия, которая изменяется внутри вашей функции.

Передача по значению создает копию объекта, переданного функции, и любые изменения, внесенные в нее, вносятся только в копию. Вместо этого передайте указатель по ссылке, если вы хотите изменить указатель с помощью функции. Что-то вроде

void initNode(Node* &b)
{
    b = new Node();
}
Другие вопросы по тегам