C ++: Initialisiere einen Mitgliedszeiger auf null?
Habe ich eine Klasse, die sieht so aus:
class Foo
{
public:
Foo();
virtual ~Foo();
private:
Odp* bar;
};
Möchte ich initialisieren bar
zu NULL
. Ist dies der beste Weg, es zu tun?
Foo::Foo() : bar(NULL)
{
}
Außerdem ist es notwendig, dass der Destruktor virtuell ist? (Wenn das wahr ist, dann muss der Konstruktor virtuell sein?)
InformationsquelleAutor der Frage Nick Heiner | 2010-07-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist die richtige Weg. Also, ja.
Nicht. Der Destruktor muss nur virtuell sein, wenn Sie Erben von der
Foo
Klasse und wird mit einemFoo
Zeiger zu löschen, die von abgeleiteten Klassen (obwohl als Allgemeine Faustregel gilt, es sollte virtuell sein, wenn es irgendwelche anderen virtuellen Mitglieder).Nicht. Konstruktoren weder müssen zu
virtual
noch kann Sie.InformationsquelleAutor der Antwort greyfade
Ja, der Initialisierungsliste ist am besten.
Vielleicht. Der Destruktor sollte virtuell sein, wenn Sie die Absicht haben, alle anderen virtuellen Funktionen der Klasse, oder wenn Sie beabsichtigen, die die Klasse geerbt werden aus (obwohl in der Regel diejenigen Dinge, die zusammen gehen).
Nicht. Es ist nicht möglich, einen virtuellen Konstruktor in C++. (was würde so etwas auch bedeuten?)
Art der Frage lässt mich vermuten, dass Sie nicht wirklich verstehen, was die
virtual
Schlüsselwort hat, oder was ist für, und Sie sind nur kopieren etwas, das Sie sah, an anderer Stelle oder in einem tutorial. Es ist am besten zu verstehen, den Zweck der alle der code Sie schreiben. Hier könnte ein Ort, um zu starten: http://www.parashift.com/c++-faq-lite/virtual-functions.htmlInformationsquelleAutor der Antwort Tyler McHenry
Vier verschiedene Möglichkeiten bestehen. Welche die beste ist bis zu Ihnen
InformationsquelleAutor der Antwort Johannes Schaub - litb
Kurze Antwort, Kein Destruktor ist nicht notwendig, um virtuelle in Ihrem Fall.
InformationsquelleAutor der Antwort bits
Anderen option, die Sie berücksichtigen sollten, ist die Verwendung einer smart-pointer-Klasse (wie
boost::scoped_ptr
boost::shared_ptr
oder C++0x istunique_ptr
), anstatt einem raw-pointer. Der Konstruktor des smart-pointer werden sicherstellen, dass es initialisiert, um etwas von NULL-wie wenn Sie nicht brauchen, einige andere explizite Initialisierung. Der smart-pointer wird auch dafür sorgen, dass das Spitze-zu-Objekt zerstört wird.Brauchen Sie nur zu entscheiden, welche Art von smart-Punkte-Kurs ist geeignet für die Position, und wählen Sie dementsprechend (auch
auto_ptr
könnte besser sein, als ein raw-pointer, solange man sich bewusst von den verschiedenen Fallstricke).InformationsquelleAutor der Antwort Michael Burr
1, ja
2, nur wenn Sie wollen, dass jemand in der Lage sein, eine Ableitung von der Klasse und verwenden Sie einen Zeiger auf die Basisklasse - aber das machen die virtuellen dtor sowieso
3, Nein, Sie können nicht über einen virtuellen ctor (oder alle ctors sind virtuelle nehme ich an?)
InformationsquelleAutor der Antwort Martin Beckett
Virtuelle Funktionen zu bestimmen, welche Funktion der Klasse (die definiert ist in Basis-und abgeleitete Klasse) muss aufgerufen werden, während der Laufzeit. Aber wenn Objekt erstellt wird-compiler weiß, welcher Konstruktor aufgerufen werden soll. für zB. als Basis-Objekt wird erstellt-base-constructor ist calledand gleiche für die abgeleitete Klasse. Daher macht Konstruktor virtual tut macht keinen Sinn.Aber einmal, wenn die Basisklasse-Objekt Zeiger auf das Objekt abgeleiteten Klasse und dann der Destruktor aufgerufen wird ,der compiler Durcheinander kommt, welche destructor(entweder von baseor abgeleitet) muss aufgerufen werden, die können nur gelöst mithilfe von lookup-table vtable-und damit Destruktor muss virtuell sein.
InformationsquelleAutor der Antwort Priji