22 Stimmen

Verwendung von new (this) zur Wiederverwendung von Konstruktoren

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X