Dieses Thema kam kürzlich in einer Klasse auf, in der ich als Lehrassistentin tätig bin. Wir brachten den Schülern bei, wie man Konstruktoren in C++ kopiert, und die Schüler, die ursprünglich in Java unterrichtet wurden, fragten, ob man einen Konstruktor von einem anderen aufrufen kann. Ich weiß, dass die Antwort darauf nein lautet, da sie das Pedantic Flag für ihren Code im Unterricht verwenden und die alten Standards dies nicht unterstützen. Auf Stackoverflow und anderen Seiten habe ich einen Vorschlag gefunden, wie man das nachmachen kann new (this)
wie folgt
class MyClass
{
private:
int * storedValue;
public:
MyClass(int initialValue = 0)
{
storedValue = new int(initialValue);
}
~ MyClass()
{
delete storedValue;
}
MyClass(const MyClass &b)
{
new (this) MyClass(*(b.storedValue));
}
int value() {
return *storedValue;
}
};
Dies ist ein sehr einfacher Code, der durch die Wiederverwendung des Konstruktors natürlich keinen Code einspart, aber er dient nur als Beispiel.
Meine Frage ist, ob dies sogar standardkonform ist, und ob es irgendwelche Randfälle gibt, die berücksichtigt werden sollten, die verhindern würden, dass dies ein solider Code ist?
bearbeiten : Ich sollte anmerken, dass mir das sehr gefährlich vorkommt, aber das liegt mehr daran, dass ich es nicht wirklich verstehe, als daran, dass ich weiß, wie es schief gehen kann. Ich wollte nur sicherstellen, dass ich, wenn ich von Schülern danach gefragt werde, sie darauf hinweisen kann, warum sie es tun können oder nicht tun sollten. Ich habe ihnen bereits vorgeschlagen, für alle praktischen Zwecke eine gemeinsame Initialisierungsmethode zu verwenden. Dies ist eher eine Frage für den Unterricht als für ein praktisches Projekt.