lista obiektów dziedziczących po klasie abstrakcyjnej

0

Potrzebuję pomocy.
Mam takie coś:

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <list>
#include <stdlib.h>

using namespace std;

enum Player
{
	BLACK,
	WHITE
};

struct position
{
	int x;
	int y;
};

/* z uwagi na to że klasa zawiera przynajmniej jedną funkcję czysto wirtualną będzie klasą abstrakcyjną */
class Piece
{
public:
	Player user;
	position pos;
	virtual list<position> move()
	{
		list<position> lista;
		return lista;
	}
	virtual int value() const = 0;
	Piece(Player u, position p) : user(u), pos(p) { } // definicja dwuparametrowego konstruktora klasy
};

/* klasy dziedziczące po klasie abstrakcyjnej Piece : Pawn, Rook, Knight, Bishop, Queen, King */

class Pawn : public Piece
{
public:
	Pawn(Player u, position p) : Piece(u, p) { } // wywołujemy konstruktor abstrakcyjnej bazowej klasy Piece
	int value()
	{
		return 1;
	}
};

class Rook : public Piece
{
public:
	Rook(Player u, position p) : Piece(u, p) { } // wywołujemy konstruktor abstrakcyjnej bazowej klasy Piece
	int value()
	{
		return 5;
	}
};

class Knight : public Piece
{
public:
	Knight(Player u, position p) : Piece(u, p) { } // wywołujemy konstruktor abstrakcyjnej bazowej klasy Piece
	int value()
	{
		return 3;
	}
};

class Bishop : public Piece
{
public:
	Bishop(Player u, position p) : Piece(u, p) { } // wywołujemy konstruktor abstrakcyjnej bazowej klasy Piece
	int value()
	{
		return 3;
	}
};

class Queen : public Piece
{
public:
	Queen(Player u, position p) : Piece(u, p) { } // wywołujemy konstruktor abstrakcyjnej bazowej klasy Piece
	int value()
	{
		return 9;
	}
};

class King : public Piece
{
public:
	King(Player u, position p) : Piece(u, p) { } // wywołujemy konstruktor abstrakcyjnej bazowej klasy Piece
	int value()
	{
		return 0;
	}
};

int main()
{
	/* utworzenie nowej listy bierek na szachownicy - lista pusta po utworzeniu */
	list<Piece> lista;

        return 0;
}

W momencie gdy taką listę chcę zrobić tym poleceniem :

list<Piece> lista;

dostaję komunikat że nie można utworzyć instancji klasy abstrakcyjnej.
Mam dwa pytania:

  1. Jak utworzyć listę obiektów wywodzących się z klas dziedziczących po klasie abstrakcyjnej w c++ ?
  2. Dlaczego kompilator próbuje w ogóle tworzyć instancję klasy abstrakcyjnej ? (przecież ja tworzę tylko listę a nie obiekt klasy abstrakcyjnej)
1

bo masz

list<Piece> 

lista zamiast

list<Piece*> lista.

Poczytaj o polimorfizmie, popatrz na przykłady. To co zrobiłeś próbuje sobie stworzyć obiekt Piece i w tym jest pies pogrzebany.

3

Klasa abstrakcyjna nie jest w pełni zdefiniowana. Nie możesz utworzyć czegoś co nie jest kompletne. Potrzebujesz listy wskaźników a nie listy obiektów.
BTW dziedziczenie w tym przypadku to słaby pomysł. Wszystkie klasy pochodne robią dokładnie to samo co klasa rodzica, nie zmieniają zachowania, nie dodają funkcjonalności == nie ma powodu by z korzystać z tego mechanizmu.

1

Lista, jak i wszystkie inne kontenery z biblioteki standardowej, przeznaczona jest do trzymania obiektów. Nie możesz trzymać obiektu, który nie może istnieć - np. instancji klasy abstrakcyjnej. Dlatego też nie możesz utworzyć takiej listy. Zamiast tego powinieneś utworzyć listę unique_ptr<Piece> (albo shared_ptr<Piece> albo Piece* w bardz szczególnych przypadkach).

Ponadto zgadzam się z przedmówcami, tutaj preferowałbym brak polimorfizmu.

0

To tylko przykład. Będzie on jeszcze rozbudowywany. Gdyby to był koniec to oczywiście polimorfizmu bym tutaj nie używał, ale przykład będzie mocno rozbudowany jeszcze i ten mechanizm się tutaj przyda. Dzięki za poradę Panowie i odpowiedzi na moje pytania. Temat zamykam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1