2012-04-11 12 views
0

Derzeit diese Hierarchie von Objekten aufbauend und in der Lage sein, die Protokollierung in der Basisklasse ein wenig klarer zu machen, entschied ich mich für eine Art von Variable oder Funktion, die den Typ der Klasse zurückgibt.Objektkennung, Rückgabewert oder Variable?

Zum Beispiel:

class fruit { 
    string _type; 

    fruit() { 
     _type = "base"; // or i dont have to set it. however, it wont be inforced 
    } 

    virtual const char* type() const { return "base"; } // or just = 0 to inforce it 

    void function() { 
     log(this->type(), " tastes good"); 
     log(this->_type, "tastes good"); 
    } 
} 

class apple : public fruit { 

    apple() { 
     _type = "apple"; 
    } 

    const char* type() const { return "apple"; } 
} 

Wie Sie können es zwei Ansätze zu sehen ist und mich persönlich denke, dass der Rückgabewert Version ist viel sauberer, da es klar ist, dass es umgesetzt werden muss.

Meine Frage jedoch ist, welcher Ansatz der beste ist? Und ist es viel langsamer eine Funktion aufzurufen, wenn ich etwas logge? Ich bin nur davon ausgegangen, dass es optimiert wäre, aber ich kann mich irren.

Antwort

1

Zunächst einmal, wenn Sie benötigen wissen die Art der Klasse in Ihrem Programm, dann ist etwas falsch in Ihrem Design. In der Regel möchten Sie nicht Ihr Programm auf Betonimplementationen angewiesen, sondern auf Schnittstellen angewiesen sein.

Wie auch immer, die Funktion sollte eine rein virtuelle Funktion sein, so dass jede ableitende Klasse sie implementieren muss, sonst würden Sie die falschen Typen für abgeleitete Klassen bekommen, wenn jemand sie nicht für ihre derivierende Klasse implementiert.

Die Zuweisung eines Strings und die Rückgabe eines String-Literals sind beide in Ordnung.
String-Literale haben eine statische Speicherdauer, so dass sie während der gesamten Laufzeit des Programms gültig ist. Außerdem haben Sie den Rückgabetyp const char, sodass der Benutzer das zurückgegebene Literal nicht ändert und ein Undefined Behavior verursacht.
Das Zurückgeben eines Mitglieds ist auch gut, obwohl es nur einige Overhead eines zusätzlichen Mitglieds zu Ihrer Klasse hinzufügen & Sie sind nicht allzu besorgt über dieses zusätzliche Mitglied.

+0

das einzige, was ich benutze, ist die Protokollierung, um klar zu machen, welche dervied Klasse im Umgang mit. Ich brauche dafür ein char * und beschreibe die Klasse. Siehst du damit nichts falsch, oder? – chikuba

+0

@ chikuba: Sieht in diesem Fall gut aus. Beachten Sie den Punkt über die Funktion rein virtuell zu machen. –

+0

nicht allzu sicher, was Sie von "Sie wollen nicht auf Ihr Programm, um sich auf konkrete Neuerungen verlassen, sondern auf Schnittstellen angewiesen sein." – chikuba

Verwandte Themen