Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » smartpointer faq von virtual

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
23.03.2004, 14:09 Uhr
~Dirk23
Gast


Hi Virtual,

ich lese gerade mit großem Interesse deine Anleitung zum Thema Smartpointer. Den größten Teil habe ich auch schon verstanden und es ist wirklich eine Supertechnik. Durch Anwendung dieser Smartpointerklasse wird man Memory Leaks nun leicht vermeiden können.
Nun aber zu meiner Frage. Ich kenne mich leider noch nicht so gut aus.

Wann wird ein Destruktor, der unter protected deklariert ist, eigentlich aufgerufen?
Warum hast du den Destruktor der Klasse share_t unter protected deklariert und nicht als private oder public?

Vielen Dank schon mal im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.03.2004, 14:13 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ist vermutlich protected damit man aus ner abgeleiteten klasse noch drauf zugreifen kann... wäre public könnte da jeder mit rumwurschteln und bei private hätte man aus ner abgelittenen klasse kein zugriff mehr drauf...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.03.2004, 14:29 Uhr
~Dirk23
Gast


Gut, danke für deine Antwort, aber das weiss ich im Prinzip schon. Aber im Unterschied zu einer gewöhnlichen Methode kann ich einen Destruktor ja nicht explizit aufrufen. Deshalb meine Frage, wann er automatisch aufgerufen wird, wenn er unter protected bzw. private steht. Hier macht es ja keinen Unterschied, da keine Vererbung im Spiel ist.

Vielen Dank schonmal

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.03.2004, 14:38 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Aber im Unterschied zu einer gewöhnlichen Methode kann ich einen Destruktor ja nicht explizit aufrufen.




C++:
#include <iostream>

class myClass{

public:
    myClass();
    ~myClass();
};

myClass::myClass(){std::cout<<"Construction\n";}
myClass::~myClass(){std::cout<<"Destruction\n";}

int main(){
myClass mc;
mc.~myClass();
}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.03.2004, 14:58 Uhr
~Dirk23
Gast


Oh weh, ich nehm alles zurück. Da habe ich mich wohl getäuscht. Aber immer gut, wenn man dadurch was neues lernt.

Dennoch bleibt die Frage offen, wann dann ein als private oder protected deklarierte Destruktor implizit aufgerufen wird.

mfg

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.03.2004, 15:01 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


das kann ich dir auch nicht ganau sagen...virtual wirds wissen aber der ist in letzter zeit nicht häufig online.
für mich hat das halt nur sinn gemacht das nicht public zu deklarieren damit nicht jeder "dahergelaufene" das aufrufen kann...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.03.2004, 14:03 Uhr
ao

(Operator)



Zitat:
~Dirk23 postete
Dennoch bleibt die Frage offen, wann dann ein als private oder protected deklarierte Destruktor implizit aufgerufen wird.

Wenn eine Instanz einer davon abgeleiteten Klasse zerstört wird. Und das ist der Trick.

Mit einem protected Destruktor verhindert man die Instanzierung einer Klasse, lässt aber zu, dass es Ableitungen gibt, die instanzierbar sind. Damit macht man die Klasse zur abstrakten Basisklasse. Beispiel:

C++:
class CFisch
{
protected:
    CFisch () {}
    ~CFisch () {}
};

class CHering
: public CFisch
{
public:
    CHering ()
    : CFisch ()
    { }

    ~CHering () { }
};

int main (void)
{
    CHering h;
    CFisch f; /* Fehler */
    return 0;
}


Es gibt keine Instanz von Fisch, alle Fische sind entweder Heringe oder Forellen oder ...

Eine Klasse mit privatem Destruktor kann sich nur selbst instanzieren - typisch z.B. für Singleton-Verhalten.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
24.03.2004, 19:38 Uhr
~Dirk23
Gast


Hi ao,

vielen Dank für deine Antwort. Nun weiss ich Bescheid, wie ein protected Destruktor verwendet wird und warum.
Aber in Virtuals Beispiel wird keine Klasse von share_t abgeleitet. Folglich heisst das doch, dass der Destruktor der share_t Klasse niemals aufgerufen wird.
Warum hat er es in diesem Fall so gemacht?
Hat er so weit vorausgedacht, dass man evtl. mal eine Ableitung der Klasse share_t erstellen möchte und deshalb den Destruktor dort als protected implementiert?

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
25.03.2004, 11:14 Uhr
ao

(Operator)



Zitat:
~Dirk23 postete
Aber in Virtuals Beispiel wird keine Klasse von share_t abgeleitet. Folglich heisst das doch, dass der Destruktor der share_t Klasse niemals aufgerufen wird.

Das share_t-Objekt zerlegt sich selber (in der Methode rem_ref, wenn der Referenz-Counter auf 0 abgezählt wird). Es kann nicht von außen zerlegt werden. Wahrscheinlich könnte man strenger sein und den Destruktor private definieren, hast du's mal ausprobiert?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
25.03.2004, 13:27 Uhr
~Dirk23
Gast


Nein, habs leider noch nicht ausprobiert. Werde ich aber heute Abend oder morgen machen.
Aber nun egal, ob der Destruktor als private oder protected deklariert wird. Dieser Destruktor wird also niemals aufgerufen. Stimmst du mit mir überein?
Warum hat Virtual dann diesen Destruktor überhaupt mit Inhalt gefüllt? Er hätte ihn doch genauso gut leer lassen können.

mfg

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: