🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

4 total messages Started by Borneq Thu, 15 Mar 2018 18:41
Destructor a funkcja wirtualna
#309652
Author: Borneq
Date: Thu, 15 Mar 2018 18:41
20 lines
1613 bytes
Mam klasę abstrakcyjną Node i metodę wirtualną toString()
chcę podczas kasowania obiektów wypisywać nazwę tego obiektu:
	virtual ~Node()
	{
		printf("delete %s\n",toString().c_str());
	}

Nie udało się zrobić:
virtual string toString() = 0
zrobiłem
virtual string toString(){ return "abstract";};	

nadpisuję te metodę w klasach ,ale i tak destructor woła ją nie wirtualnie.
Pytanie: jak zrobić wypisywanie w destructorze elementów które kasuje 
podczas gdy korzystam z takich pól jak name, które jest zdefiniowane w 
innych klasach?
Ale chyba rozumiem w czym problem, ten destruktor to za późne 
przechwycenie, bo w toString miałem wypisywać całe drzewka mające w 
korzeniu obiekt Node na rzecz którego wołam, a w destruktorze i tak 
byłyby pokasowane.
Re: Destructor a funkcja wirtualna
#309654
Author: Sebastian Biały
Date: Thu, 15 Mar 2018 19:55
11 lines
1329 bytes
On 3/15/2018 7:41 PM, Borneq wrote:
> Mam klasę abstrakcyjną Node i metodę wirtualną toString()
> chcę podczas kasowania obiektów wypisywać nazwę tego obiektu:
>      virtual ~Node()
>      {
>          printf("delete %s\n",toString().c_str());
>      }

Typ obiektu podczas konstrukcji i destrukcji zawiera inną tablicę 
wirtualną niż po konstrukcji i przed destrukcją. Innymi słowy za 
wcześnie albo za późno.
Re: Destructor a funkcja wirtualna
#309653
Author: szykcech
Date: Thu, 15 Mar 2018 20:56
16 lines
2351 bytes
> nadpisuję te metodę w klasach ,ale i tak destructor woła ją nie wirtualnie.

Z tego co pamiętam metody wirtualne nie działają w konstruktorach i destruktorach.

> Pytanie: jak zrobić wypisywanie w destructorze elementów które kasuje 
> podczas gdy korzystam z takich pól jak name, które jest zdefiniowane w 
> innych klasach?

Chyba tylko przez podanie klasy z której ma być wywołana Klasa::toString() i w tej funkcji wywoływać wcześniejsze wersje tej funkcji.

> Ale chyba rozumiem w czym problem, ten destruktor to za późne 
> przechwycenie, bo w toString miałem wypisywać całe drzewka mające w 
> korzeniu obiekt Node na rzecz którego wołam, a w destruktorze i tak 
> byłyby pokasowane.

Nie były by pokasowane dopóki destruktor nie zostanie wykonany lub dopóki sam nie usuniesz drzewka w destruktorze (zależnie jak był tworzony - jako zmienna klasy czy przez new).
Re: Destructor a funkcja wirtualna
#309655
Author: M.M.
Date: Sat, 17 Mar 2018 21:12
11 lines
1694 bytes
On Thursday, March 15, 2018 at 7:41:39 PM UTC+1, Borneq wrote:
> Mam klasę abstrakcyjną Node i metodę wirtualną toString()
> chcę podczas kasowania obiektów wypisywać nazwę tego obiektu:
> 	virtual ~Node()
> 	{
> 		printf("delete %s\n",toString().c_str());
> 	}

Ja bym najpierw dodał flush po printf. Jeśli nie zadziała, to daj znać.

Pozdrawiam
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads