Как разыменовать указатель, переданный по ссылке в C ++? - PullRequest
1 голос
/ 08 октября 2009

Я делаю (что-то вроде) это:

void insert(Node*& node, string val, Node* parent)
{
   if (node == NULL)
     instantiateNode(node, val, parent);
   else
     insert(node->child, val, node);
}

Дело в том, что instantiateNode(..., parent), кажется, изменяет исходный *&node, переданный в функцию при установке *parent. instantiateNode() - это , предполагается , чтобы изменить node, но если он изменит parent, тогда у вас есть узел, для которого установлен родитель, что не имеет смысла, а также Работа. На всех.

Причина, по которой я вообще беспокоюсь о ссылках на указатели, заключается в том, что это исключает особые случаи и значительно сокращает количество проверок ошибок, которые мне приходится делать. Так как я делаю это для уменьшения количества строк и тривиального дублирования алгоритма, я могу обойти это, приблизительно удвоив количество строк кода. Но я бы предпочел этого не делать, и я чувствую, что должен быть способом разыменования ссылки на указатель, чтобы получить новый указатель, указывающий на тот же объект. И действительно, я думал, что проход от *&node до *parent должен был это сделать, но, очевидно, gcc оптимизирует его.

Ответы [ 3 ]

4 голосов
/ 08 октября 2009

должен быть способ разыменования ссылки на указатель, чтобы получить новый указатель, указывающий на тот же объект.

Ну, как насчет этого?

Node* n = node;

Теперь у вас есть нереференсный указатель, который указывает на тот же объект, что и узел, именно то, что вы просили.

Я на 95% уверен, что проблема, с которой вы сталкиваетесь, не имеет ничего общего со ссылками, и все, что связано с ошибочной логикой в ​​instantiateNode или вашим использованием. Вот почему было бы полезно, если бы вы дали нам больше информации о том, что должен делать код, или даже разместили код в instantiateNode.

3 голосов
/ 08 октября 2009

узел - это ссылка на указатель, что означает, что если функция устанавливает узел, переданное значение изменяется. Так работают ссылки.

Если вы не хотите, чтобы узел вызывался в вызывающей функции, не делайте его ссылкой.

Или я что-то не так понял?

0 голосов
/ 08 октября 2009

Я не думаю, что node нужно передавать по ссылке. Простой указатель должен сделать работу. Это потому, что вам никогда не нужно менять это напрямую. Почему вы передаете его на instantiateNode()? Это всегда будет NULL, так что хорошего в этом? Если instantiateNode() также передал свой первый аргумент в качестве ссылки, почему? Вы передаете родительский элемент, поэтому instantiateNode() может просто получить доступ к тому, что node должен представлять через parent->child. Даже если по какой-то причине instantiateNode() принимает его параметр по ссылке, и это необходимо, я считаю, что функция все равно будет работать, если вы отбросите ссылку из первого аргумента insert(). Все, что instantiateNode() делает с этим значением, будет просто потеряно при возврате функции. Извините, это так запутывает, но я не могу придумать лучшего способа выразить это.

Есть другое толкование вашей проблемы ... возможно, ваш звонок insert() должен звучать так:

insert(node, val, node->child);
...