Polimorfizm w DLL

0

Cześć. Postanowiłem spakować kilka klas do biblioteki DLL. W zwykłym exe'ku wszystko chodzi cacy, ale kiedy tylko przeniesie się kod do DLL z odpowiednimi zmianami, to dziwnym trafem wysiada przesłanianie metod wirtualnych klas nadrzędnych. Ktoś miał styczność z takim problemem?

Obiło mi się o uszy, że rozwiązaniem może być zastosowanie myku nazywanego STUB, ale google biedne w wiedzę :S

0

Pokaz przykladowy kod interfejsu po stronie exe i jego implementacje z dllki.

0

To jest w DLL'ce

class DLL_API Creature
{
protected:
	int HP;
	int MP;
	char* name;
public:
	virtual void attack(Creature*)=0;
};

class DLL_API Monster : public Creature
{
	int exp;
public:
	Monster(char*, int, int);
	void attack(Creature*);
};

class DLL_API Hero : public Creature
{
public:
	Hero(char *, int, int, int);
};

W pliku kożystającym z DLL

int main()
{
	Creature *c1 = new Monster("Belzebub", 30, 200);
	Creature *c2 = new Monster("Jozin", 10, 10);

	c1->attack(c2);

	system("pause");
}

Obiekty się tworzą, ale przy wykonywaniu attack() wyrzuca mi wywołanie Pure Virtual'ki, która przecież jest przesłonięta ;/

W exeku bez dll, deklaracja klasy:

class Creature
{
protected:
	int HP;
	int MP;
	char* name;
public:
	virtual void attack(Creature*)=0;
	char* getName() { return name; };
};

class Monster : public Creature
{
	int exp;
public:
	Monster(char*, int, int);
	void attack(Creature*);
};

class Hero : public Creature
{
public:
	Hero(char *, int, int, int);
};

a potem w mainie:

int main()
{
	Creature *c1 = new Monster("Wilk", 10, 30);
	Creature *c2 = new Monster("Sokol", 50, 30);

	c1->attack(c2);

	system("PAUSE");
	return 0;
}
0

Po stronie execa masz zadeklarowac interfejs Creature z metodami wirtualnymi.
Po stronie dllki masz sobie zrobic funkcje(fabryke), ktora bedzie zwracac wskaznik na Creature, ale w niej juz bedzie tworzony Monster(implementacja interfejsu), ktory dziedziczy po Creature.
Dodam, ze przydalaby sie jeszcze funkcja w dll'ce do zwalniania tego co utworzyc w dll'ce - unikniesz przykrosci z dziwnym zachowaniem pamieci ;)

Jezeli dobrze zrozumialem to u Ciebie jest kolejna deklaracja Creature w dllce i sie dziwisz, ze sypie bledami?

0
Valarius napisał(a)

Jeśli dobrze zrozumialem to u Ciebie jest kolejna deklaracja Creature w dllce i sie dziwisz, ze sypie bledami?

Nie, jest albo tu, albo tu.

0
Valarius napisał(a)

Po stronie execa masz zadeklarowac interfejs Creature z metodami wirtualnymi.

przeciez go ma..

Valarius napisał(a)

Po stronie dllki masz sobie zrobic funkcje(fabryke), ktora bedzie zwracac wskaznik na Creature, ale w niej juz bedzie tworzony Monster(implementacja interfejsu), ktory dziedziczy po Creature.
Dodam, ze przydalaby sie jeszcze funkcja w dll'ce do zwalniania tego co utworzyc w dll'ce - unikniesz przykrosci z dziwnym zachowaniem pamieci ;)

czy ja wiem. jesli mu sie EXE'k skompilowal i zlinkowal, to znaczy ze importy konstruktora i destruktora poprawnie sie spiely z symbolami z DLL, wiec jeden pies w ktorym miejscu sa fizycznie wywolane. To co opisujesz BYLOBY wymagane JESLI definicja subklasy MONSTER mialabybyc widoczna tylko w DLL. Tutaj jest widoczna takze w EXE wiec doprawy tego o czym prawisz nie potrzeba

Edoga napisał(a)
int main()
{
	Creature *c1 = new Monster("Belzebub", 30, 200);
	Creature *c2 = new Monster("Jozin", 10, 10);

	c1->attack(c2);

	system("pause");
}

Obiekty się tworzą, ale przy wykonywaniu attack() wyrzuca mi wywołanie Pure Virtual'ki, która przecież jest przesłonięta ;/

takie durne pytanie mam.. a DLL'ka sie zaladowala poprawnie? moze masz PV'ki dlatego ze dllka nie zostala zaladowana w runtimie? sprobuj wypisac cout << &Monster::attack << endl; - jesli bedzie zerem, to znaczy ze albo nie zostala zaladowana, albo jakims niefartem symbole sie nie dopasowaly

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