В C ++, как я могу предотвратить переопределение моих указателей при повторном вызове функции? - PullRequest
0 голосов
/ 06 октября 2010

все!Я не знаю, правильное ли здесь слово «переопределено».В моем классе программирования я должен создать круговой список, такой, что каждый узел узла содержит указатель, указывающий на следующий узел, а последний узел указывает на первый узел.Кроме того, есть хвостовой узел, который указывает на последний добавленный узел (его ноль до добавления каких-либо узлов).

Я не могу заполнить свой список (называемый кольцом), потому что каждый раз, когда я вызываю Ring ::Функция Insert (const int & d), которая вставляет один узел и попадает в строку «RingNode newNode (d);», новый объект RingNode перезаписывает предыдущий объект RingNode, который был создан, когда я последний раз вызывал Ring :: Insert(const int & d) функция.Очевидно, я не хочу этого, потому что это портит мой список.Как сделать так, чтобы каждый раз, когда функция создавала новый объект RingNode, он не мешал предыдущим объектам RingNode?

Исходный код из моего заголовочного файла, на всякий случай:

class RingNode {
public:
    RingNode(const int& i=0 ): data(i), next(NULL){}
private:
    int data;  /* ID of player */
    RingNode* next;
friend class Ring;

А вот и рассматриваемая функция

RingNode* Ring::Insert(const int& d){
    RingNode newNode(d); //This line overwrites previous RingNode objects
    RingNode* refNode = &newNode; //Probably bad form, but that's not my main concern right now
    if (tail==null){
            tail = refNode;
            newNode.next = refNode;
            return refNode;
    }
    newNode.next = (*GetTail()).next;
    (*GetTail()).next = refNode;
    tail = refNode;
    return refNode;
}

Так, например, если я выполню следующий фрагмент в моем главном ...

Ring theRing;
theRing.Insert(5);
theRing.Insert(2);
theRing.Insert(7);

Если я отладлю свой проектЯ вижу, что кольцо содержит только один RingNode, сначала это 5 RingNode, затем 2 RingNode перезаписывает его, затем 7 RingNode перезаписывает это.Спасибо за чтение и двойное спасибо за ваши ответы!

РЕДАКТИРОВАТЬ: я заменил

RingNode newNode(d); 
RingNode* refNode = &newNode;

на

RingNode *newNode = new RingNode(d);

настроил остальную часть кода, и он работает правильно,Большое спасибо за помощь, ребята!Очень информативно и лучше всего я теперь понимаю , почему это испортилось.

Ответы [ 4 ]

2 голосов
/ 06 октября 2010

Вы повторно используете одну и ту же локальную переменную в стеке каждый раз.

RingNode newNode(d); //This line overwrites previous RingNode objects

- локальная переменная - она ​​живет в стеке.Так что он действителен только в течение жизни вашего метода вставки.Однако, поскольку вы вызываете вставку несколько раз подряд из одной и той же вызывающей функции, ваш другой "newNode" оказывается в одном и том же месте в стеке.1006 *

RingNode *refNode = new RingNode(d);

Это будет динамически распределять ваш RingNode в куче.

Однако теперь вам нужно беспокоиться об использовании delete для очистки всех узлов при разрушении вашего Ring.

1 голос
/ 06 октября 2010

Вам нужно создавать объекты, которые выходят за рамки вашей функции ... поэтому вам нужно использовать оператор new.

RingNode* Ring::Insert(const int& d){
    RingNode* refNode = new RingNode(d); // this line creates a ring node not bound to the scope of the function.
    if (tail==null){
            tail = refNode;
            newNode.next = refNode;
            return refNode;
    }
    newNode.next = (*GetTail()).next;
    (*GetTail()).next = refNode;
    tail = refNode;
    return refNode;
}
1 голос
/ 06 октября 2010
RingNode newNode(d);
RingNode* refNode = &newNode;

Заменить на:

RingNode* refNode = new RingNode(d);

Кстати, заменить

RingNode(const int& i=0 )

с:

RingNode(int i=0 )

Нет необходимости использовать ссылку для малого типа, такого как целое число.

0 голосов
/ 06 октября 2010

Вы не можете добавить объект, выделенный как переменная "auto", то есть в стек, например. Вам нужно сделать RingNode *newNode = new RingNode(d); и добавить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...