Ist das erlaubt?Was ist falsch an dieser Nutzung des neuen Betreibers?
Antwort
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) {
/* ... */
}
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? –
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
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)
{
}
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. –
Ich nannte es C++ 0x aber es ist nicht mehr :( – AraK
Ja ist es. X ist eine Hexadezimalziffer –
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); }
};
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. –
das scheint ein bisschen zwielichtig ... dann kommt eines Tages jemand und entscheidet sich von Objekt –
zu erben. Etwas wie 'boost :: noninheritable' könnte verwendet werden, um sicherzustellen, dass niemand von' Object' erbt. –
- 1. Was ist falsch an dieser JavaScript-Funktion?
- 2. Was ist falsch an dieser XML-Datei?
- 3. Anfängerhilfe: Was ist falsch an dieser Methode?
- 4. Was ist falsch an dieser gespeicherten Prozedur?
- 5. Was ist falsch an dieser "StretchKey" Implementierung?
- 6. Was ist falsch an dieser MySQL-Syntax?
- 7. Was ist falsch an dieser Funktion?
- 8. Was ist falsch an dieser MySQL Query?
- 9. Was ist falsch an dieser Java-Syntax?
- 10. Was ist falsch an dieser SimPy-Installation?
- 11. Was ist falsch an dieser Klasse? (QDBusAbstractAdaptor)
- 12. Was ist falsch an dieser Indexdefinition in dieser MySQL-Abfrage?
- 13. Was ist falsch an dieser mehrkanaligen PCRE-Aufnahme?
- 14. Schienen 4: Was ist falsch an dieser Methode?
- 15. Was ist falsch an dieser SQL INSERT-Anweisung?
- 16. (Obj-C) Was ist falsch an dieser Syntaxhervorhebung?
- 17. Was ist falsch an dieser Zusammenführungs-Sort-Code?
- 18. Was ist falsch an dieser sha 256 Funktion?
- 19. Was ist falsch an dieser Global.asax Routing-Einstellung?
- 20. Was ist falsch an der Syntax dieser React Render Funktion?
- 21. Was ist falsch an dieser Verwendung von Prädikat/CreateDelegate?
- 22. Was ist falsch an dieser Instanz: ArrowApply Automaton?
- 23. Was ist falsch an dieser POST-Anfrage-Implementierung?
- 24. Was ist falsch an dieser einfachen Python-Metaklasse?
- 25. Was ist falsch an dieser Ausnahme zum erneuten Werfen?
- 26. Was ist falsch mit dieser Vektorcodierung? (Anfänger)
- 27. Was ist mit dieser Abfrage falsch?
- 28. Was ist falsch mit dieser Neuzuordnung?
- 29. Was ist falsch mit dieser Webcam Gesichtserkennung?
- 30. Was ist falsch mit dieser JavaScript-Syntax
schlechte Idee. Mitglieder werden nicht korrekt zerstört. Und um es zu erhalten, muss man stackoverflow.com fragen, ob es eine gute Idee ist. –