Указатель данных члена инициализируется в куче
У меня есть класс 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();
}