Есть два класса: первый - 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. Как быть?
Так как аргумент временный объект, на адрес этот не стоит надеятся, что будет валидным. Нужно создавать новый экземпляр в куче. И не забыть освобождать память с помощью 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));
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
MapViewOfFile возвращает указатель на начало проекции куска большого текстового файлаА какие должны быть дальнейшие манипуляции, чтобы разобрать...
Как извлечь ID потока из pthread_self() в целочисленную переменную? То есть что-то типа такого:
Я новичок и прошу помощиЕсть ThemesActivity в котором прописано динамическое изменение темы при выборе одного из radiobutton
Недавно начал учить Java, изучал if, решил вот такое написатьПри вводе правильного username и password, которые соответствуют adminUsername и adminPassword, всё-равно...