Usuwanie obiektów

0

Witam.
Mam obiekt o nazwie Bullet o następującej konstrukcji:

class Bullet
{
	public:
		char letter;
		int clock;
		int speed;
		int posX, posY;
		int moveDir;
		
		Bullet(char a, int b, int c, int d, int e, int f)
		{
			letter = a;
			clock = b;
			speed = c;
			posX = d;
			posY = e;
			moveDir = f;
		}
		
		~Bullet();
};

Jak teraz usunąć ten obiekt aby zwolnić pamięć?

delete bullets[x];

Powyższy przykład gdzie bullets[x] to wskaźnik do klasy nie działa, zwracając błąd:

  [Linker error] undefined reference to `Bullet::~Bullet()' 
0

Zapomniałeś zdefiniować destruktor.

0

No dobra, problem z klasą Bullet załatwiło to:

		~Bullet() {
			
		};

Jednak, mam jeszcze analogiczną klasę Enemy która jest dosłownie taka sama jak Bullet, zmienia się tylko nazwa, dekonstruktor zdefiniowałem tak samo:

		~Enemy() {

		};

i błąd:

[Linker error] undefined reference to `Enemy::~Enemy()' 
0
Visher napisał(a)

No dobra, problem z klasą Bullet załatwiło to:

		~Bullet() {
			
		};

Jednak, mam jeszcze analogiczną klasę Enemy która jest dosłownie taka sama jak Bullet, zmienia się tylko nazwa, dekonstruktor zdefiniowałem tak samo:

		~Enemy() {

		};

i błąd:

[Linker error] undefined reference to `Enemy::~Enemy()' 

Diabeł tkwi w szczegółach a podstawowym wrogiem programisty jest nastawienie pt. "To nie możliwe". Pokaż kod z Enemy - gdzieś jest bryndza i nie ma co się upierać że wszystko jest takie same jak w Bullet. Może kopiuj wklej było?

0

Mówisz masz ;)

class Enemy
{
	public:
		char letter;
		int clock;
		int speed;
		int posX, posY;
		int moveDir;
				
		Enemy(char a, int b, int c, int d, int e, int f)
		{
			letter = a;
			clock = b;
			speed = c;
			posX = d;
			posY = e;
			moveDir = f;
		}
		
		~Enemy() {
			
		};
};
0

Hmm u mnie działa - coś musi być walnięte w kodzie w innym miejscu, albo źle masz dołączone pliki wynikowe do projektu że linker nie widzi.

Tak przy okazji nie warto dzielić identycznych klas na 2 klasy. Czym te klasy się różnią? Niczym - chyba że implementacja będzie inna. Jeśli tak to lepiej zrobić klasę bazową a następnie implementacje zrobić w klasach pochodnych.

0
Hostel napisał(a)

Hmm u mnie działa - coś musi być walnięte w kodzie w innym miejscu, albo źle masz dołączone pliki wynikowe do projektu że linker nie widzi.

Tak przy okazji nie warto dzielić identycznych klas na 2 klasy. Czym te klasy się różnią? Niczym - chyba że implementacja będzie inna. Jeśli tak to lepiej zrobić klasę bazową a następnie implementacje zrobić w klasach pochodnych.

Tak już miałem w planach, zrobić klasę Entity z pochodnymi Enemy i Bullet, ale stanąłem na tym czym piszę.

0
Visher napisał(a)

Tak już miałem w planach, zrobić klasę Entity z pochodnymi Enemy i Bullet, ale stanąłem na tym czym piszę.

W czym masz ten projekt? Możesz dać przykładowy kod wraz z include przy którym Ci wywala taki komunikat?

0

A Ty byś pokazała od tak kod źródłowy swojej gry? ;-D

0

W QT handlery eventów to zwykłe metody virtualne. Nie jest tak jak mówisz, że każde przeładowanie eventa jest niejawnie wołane:

Qt 4.7 Reference Documentation napisał(a)

The normal way for an event to be delivered is by calling a virtual function. For example, QPaintEvent is delivered by calling QWidget::paintEvent(). This virtual function is responsible for reacting appropriately, normally by repainting the widget. If you do not perform all the necessary work in your implementation of the virtual function, you may need to call the base class's implementation.

Może chodzi o coś takiego, żeby event otrzymywała klasa najbardziej bazowa i najbardziej pochodna? Coś takiego:

class Base
{
private:
	void DoFoo()
	{
		cout << "Method from class 'Base' running..." << endl;
		this->OnFoo();
	}

protected:
        virtual void OnFoo() { }

public:
	void RaiseFoo() { this->DoFoo(); }
};
 
class Child : public Base
{
protected:
        virtual void OnFoo() { cout << "Hello I'm your child :)" << endl; }
};

class Grandchild : public Child
{
protected:
        virtual void OnFoo() { cout << "Hello I'm your grandchild :)" << endl; }
};

cout << "BASE:" << endl;
Base *base = new Base;
base->RaiseFoo();

cout << "CHILD:" << endl;
Base *child = new Child;
child->RaiseFoo();

cout << "GRANDCHILD:" << endl;
Base *grandchild = new Grandchild;
grandchild->RaiseFoo();

Wynik:

BASE:
Method from class 'Base' running...
CHILD:
Method from class 'Base' running...
Hello I'm your child :)
GRANDCHILD:
Method from class 'Base' running...
Hello I'm your grandchild :)

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