Проблема при добавлении в конец double linked list, C++

148
15 января 2020, 11:00

Есть два класса: первый - Game, второй - List (он же double listed list).

 class Game {
        int direction;
        int points;
        int allMoney;
        Game * nextPtr;
        Game * prevPtr;
    public:
        friend class List<Game>;
        Game(int _points, int _direction)
        {
            points = _points;
            direction = _direction;
            allMoney = 0;
        }
    };
    template <class NodeType>
    class List
    {
    public:
        List();
        void insertAtBack(NodeType&);
        int isEmpty() const { return firstPtr == 0; }
    private:
        int Size;
        NodeType * firstPtr;
        NodeType * lastPtr;
    };
    template<class NodeType>
    List<NodeType>::List()
    {
        firstPtr = lastPtr = 0;
        Size = 0;
    }
    template<class NodeType>
    void List<NodeType>::insertAtBack(NodeType& value)
    {
        if (isEmpty())
            firstPtr = lastPtr = &value;
        else
        {
            value.prevPtr = lastPtr;
            lastPtr->nextPtr = &value;
            lastPtr = &value;
        }
        Size++;
    }

Также есть main:

void main()
{
    int pointsArr[12] = { 50, -100, 200, -150, 250, -50, 100, -200, 150, -50, 150, 100 };
    int directionArr[12] = { 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1 };
    List<Game> quest;
    for (int i = 0; i < 12; i++) {
        Game option(pointsArr[i], directionArr[i]);
        quest.insertAtBack(option);
    }
}

Нужно создать double linked list из объектов типа Game. Проблема состоит в том, то при первой итерации в цикле main начальные значения класса List инициализируются правильно, но при второй и последующих итерациях начальные значения объекта

quest

затираются новыми значениями объекта

option

Соответственно, в linked list не добавляется второй, третий и тд. элементы, а постоянно обновляются начальные firstPtr и lastPtr. Как быть?

Answer 1

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

template<class NodeType>
    void List<NodeType>::insertAtBackMove(NodeType& value)
    {
        if (isEmpty())
            firstPtr = lastPtr =  new NodeType ( value ) ;
        else
        {
            value.prevPtr = lastPtr;
            value.nextPtr = nullptr ;
            lastPtr->nextPtr =  new NodeType ( value );
            lastPtr = lastPtr->nextPtr;
        }
        Size++;
    }

или в версии 11 :

template<class NodeType>
        void List<NodeType>::insertAtBack(NodeType && value)
        {
            if (isEmpty())
                firstPtr = lastPtr =  new NodeType ( std::move(value) ) ;
            else
            {
                value.prevPtr = lastPtr;
                value.nextPtr = nullptr ;
                lastPtr->nextPtr =  new NodeType ( std::move(value) );
                lastPtr = lastPtr->nextPtr;
            }
            Size++;
        }
  ...
  quest.insertAtBack(std::move(option));
READ ALSO
Как распарсить файл через &lt;windows.h&gt; MapViewOfFile?

Как распарсить файл через <windows.h> MapViewOfFile?

MapViewOfFile возвращает указатель на начало проекции куска большого текстового файлаА какие должны быть дальнейшие манипуляции, чтобы разобрать...

116
Получить ID потока в переменную

Получить ID потока в переменную

Как извлечь ID потока из pthread_self() в целочисленную переменную? То есть что-то типа такого:

133
Как изменить тему в других activity?

Как изменить тему в других activity?

Я новичок и прошу помощиЕсть ThemesActivity в котором прописано динамическое изменение темы при выборе одного из radiobutton

177
(Java) Значение, проверяемое if, истинно, но срабатывает else

(Java) Значение, проверяемое if, истинно, но срабатывает else

Недавно начал учить Java, изучал if, решил вот такое написатьПри вводе правильного username и password, которые соответствуют adminUsername и adminPassword, всё-равно...

148