@alexgugr
HTML/CSS/JS, C++, Python и т.д.

Как реализовать очередь объектов класса на C++?

Суть программы: игра "Пьяница".
Основное задание: реализовать очередь игровых карт.
Мой класс карты:
class card {
public:
	card() {
		next = NULL;
	}
	void setValue(int i); // Записывает значние в карту
	int getValue(); // Получает значение карты
	void printCard(); // Вывод карты
	void setNext(card &adr); // Записать адрес следующей карты
	card* getNext(); // Получить адрес следующей карты
private:
	int value; // Значение карты
	card *next; // Адрес следующей карты
};

Класс колоды (собственно это и есть очередь карт):
class player {
public:
	player() {
	}
	void enqueue(int value); // Добавить карту в руку игрока (в очередь)
	card* dequeue(); // Получить карту из руки игрока (из очереди)
	int empty(); // Остались ли у игрока еще карты
	void clear(); // Очистить руку игрока
	void printPlayer(); // Вывести все карты игрока (для тестирования)
private:
	card *lastCard = NULL; // Ссылка на последнюю карту в очереди
	card *firstCard = NULL; // Ссылка на первую карту в очереди
};

И методы добавления и удаления карты из очереди соответственно:
void player::enqueue(int value){
	if (empty()) {
		firstCard = new card;
		firstCard->setValue(value);
		lastCard = new card;
		firstCard->setNext(*lastCard);
	}
	else {
		card *newCard = new card;
		lastCard->setValue(value);
		lastCard->setNext(*newCard);
		lastCard = newCard;
	}
}

card* player::dequeue() {
	card *tmp = firstCard;
	firstCard = firstCard->getNext();
	return tmp;
}


Я создаю первую карту, чтобы знать начало, и в первой карте присваиваю переменной next указатель на последующую, таким образом получается очередь последовательно связанных друг с другом карт. Но у меня реализовано неверно, так как после добавления карты в очередь, я создаю следующую карту, куда будет внесено значение следующей добавленной в очередь карты. Получается, что после добавления карты у меня в конце очереди появляется пустой элемент.
Я чувствую, что решение на поверхности, но не могу его понять. Подскажите пожалуйста.
  • Вопрос задан
  • 2801 просмотр
Решения вопроса 1
Класс player у вас не содержит явно объявленного деструктора. В то время, как в методе void player::enqueue(int value) вы выделяете динамическую память. Скорее всего, вы поимеете утечку памяти.
Используйте умные указатели, либо напишите деструктор, который все подчистит.
Сам прототип метода void player::enqueue(int value) архитектурно не верный. Аргументом должен быть не int. В в зависимости от того, что вы в конечном итоге хотите, вам нужно реализовать либо void player::enqueue(const card&), либо void player::enqueue(card&&), либо оба сразу.
Вообще работа с сырыми указателями в C++ не самая лучшая идея. Опять таки не зная окончательную задачу сложно говорить, но вам нужно возвращать в player::dequeue() либо умный указатель либо ссылку на объект либо сам объект. Но не указатель.
Класс card у вас хранит информацию о следующей карте. Это опять таки не верное архитектурное решение. Этот класс должен быть максимально простым. А очередь должна быть реализована отдельно. Сейчас у вас какое-то странное размазывание логики класса player по двум классам.
Почему бы вам не использовать стандартный контейнер queue из STL?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@evgeniy_lm
Зачем создавать след. карту? У вас в классе след. карта объявлена как указатель, т.е. если карта последняя то указатель указывает в никуда, это так же может быть признаком последней карты. Вот кода вы создаете новую карту тогда в поле next "старой последней карты" записываете указатель на экземпляр "новой последней карты"
Ответ написан
Комментировать
petermzg
@petermzg
Самый лучший программист
В колоде максимум 54 карты, для хранения выбытия карт хватит битов в int64.
Класс Card лишний.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы