[ glorius @ 25.07.2013. 13:23 ] @
Naslov je malo neprecizan pa cu dopuniti znacenje.
Zelim da napravim hijerarhiju klasa tako sto cu koristiti virtualno nasledjivanje. U svim primerima na koje sam nailazio obicno stanu kod klase koja oznacava donji deo 'dijamanta'.
Problem je da ako zelim da nasledim iz te poslednje klase dolazi do problema.

Evo primera.

Code:


class AbstractObject
{

};

class Object : virtual public AbstractObject
{

};

class Renderable : virtual public AbstractObject
{

}

class GameActor : public Object
                       , public Renderable
{

};

class Enemy : public GameActor
{

};



Problem nastaje kada pokusam da napisem:

AbstractObject * pEnemy = new Enemy;

Kompajler mi javlja:

enemy.obj:-1: error: LNK2005: "public: __thiscall Enemy::Enemy(void)" ([email protected]@[email protected]) already defined in main.obj

Ako pokusam:

AbstractObject* pActor = new Actor,

radi lepo kao i u primerima u nekim artiklima.

Da li je uopste moguce naslediti iz klase koja predstavlja donji deo 'dijamanta' koji se formira virtuelnim naslednjivanjem (naslediti Enemy iz GameActor?)
[ glorius @ 25.07.2013. 14:29 ] @
Greska nadjena.
Imao sam Enemy klasu na jos jednom mestu u projektu i zato je prijavljivao multiple symbols.

Da tema bude koliko toliko korisna, simisao ovakve hijerarhije je da su neki objekti Renderable (Player, Creatures ili kao kod mene Enemies, Items, Obstacles, ...) a da neki nisu, objekti koji se nalaze na mapi igre ali sluze vise kao helperi, trigeri,...
Ove helpere bih izveo iz Object. Dizajnirao sam na ovakav nacin da bih slikovitije sebi predstavio hijerarhiju i malo vezbao multiple inheritance.

Ovo je moglo i na drugi nacin pomocu single hijerarhije sto je mozda laksi nacin:

Code:


// izbacujemo AbstractObject

class Object 
{

};

class Actor : public Object  // izbacujemo Renderable i podrazumevamo da su svi Actors renderable
{

};

class Enemy : public Actor
{

};

class Helper : public Object 
{

};



Kako god dizajnirao hijerarhiju, nisam siguran kako ce se odraziti na sistem kada ubacim ostale klase. Predlozi oko nekog alternativnog dizajna su dobrodosli.