2009-08-03 10 views

Antwort

9

Mit new(this) werden Elementvariablen neu erstellt. Dies kann zu undefiniertem Verhalten führen, da sie nicht zuerst zerstört werden. Das übliche Muster ist stattdessen eine Hilfsfunktion zu verwenden:

class Object { 
private: 
    void init(int, char *); 
public: 
    Object(); 
    Object(int, char *); 
}; 

Object::Object() { 
    init(0, NULL); 
} 

Object::Object(int x, char *y) { 
    init(x, y); 
} 

void Object::init(int x, char *y) { 
    /* ... */ 
} 
+0

Also, ist die Verwendung von Placement neu auf 'this', an und für sich, undefiniertes Verhalten, oder ist es nur * potentiell * undefiniertes Verhalten, abhängig davon, welche Mitglieder die Klasse hat? Wenn die Klasse nur Mitglieder vom Typ POD hat, wäre das sicher? –

+0

Angenommen, es sind auch die anderen Fallstricke (virtuelle Funktionen etc.) vermieden, Potential. Das Verhalten von ctors und dtors ist recht gut spezifiziert. Wenn alle Mitglieder PODs sind, werden weder der ursprüngliche ctor noch das Placement new irgendetwas tun. – MSalters

2

Ich glaube, Sie delegieren Konstrukteure wollen, wie Java zum Beispiel, die noch nicht hier sind. Wenn C++ 0x kommt könnten Sie es wie folgt tun:

Object::Object() : Object(0, NULL) 
{ 

} 
+0

Meinten Sie C++ 0x? Obwohl es bis 201x nicht bereit ist, bleibt sein Name C++ 0x. Wenn du wirklich C++ 1x meintest, dann ist das eine besonders wenig hilfreiche Antwort. –

+0

Ich nannte es C++ 0x aber es ist nicht mehr :( – AraK

+1

Ja ist es. X ist eine Hexadezimalziffer –

0

Wenn Object ein POD Typ ist, dass Sie es auf diese Weise nicht initialisieren:

class Object 
{ 
    int x; 
    int y; 
    // ... 
public: 
    Object() { memset(this, 0, sizeof Object); } 
}; 
+0

Wir haben die Implementierung des Konstruktors mit zwei Argumenten nicht gesehen, daher wissen wir nicht, ob all-bits-zero wirklich die gewünschte Repräsentation ist. Insbesondere wissen wir nicht, ob der Nullzeiger auf diesem System nur aus Bits besteht. –

+0

das scheint ein bisschen zwielichtig ... dann kommt eines Tages jemand und entscheidet sich von Objekt –

+1

zu erben. Etwas wie 'boost :: noninheritable' könnte verwendet werden, um sicherzustellen, dass niemand von' Object' erbt. –

Verwandte Themen