Ich habe eine Zusammenfassung class AbstractClass
. Alle meine abgeleiteten Klassen sollten einige const std::vector
haben, aber ... dieses Feld ist mit abgeleiteten class
(mit Typ) verbunden - nicht mit Instanzen. So könnte es gut sein, es als static
zu haben. Natürlich kann ich es nicht in der Basisklasse definieren, und ich kann nicht zwingen, dies in jeder abgeleiteten Klasse zu implementieren, die in der Zukunft hinzugefügt werden kann.Reine virtuelle Methode, die const Reference
Also ich hoffe, dass jemand, der neue abgeleitete Klasse definieren wird, es als static
implementieren. (Wenn nicht, sollte das Programm in Ordnung sein, aber es wird eine unnötige Speicherbelegung geben ....). So
Ich habe eine reine vitual
Methode zurückkehr diese Variable:
virtual const std::vector<SomeType>& getVec() const = 0;
Mein existierte abgeleiteten Klasse ist wie folgt definiert:
class DerivedClass : public AbstractClass
{
public:
const std::vector<SomeType>& getVec() const { return vec; }
private:
static const std::vector<SomeType> Vec;
}
Ich versuche, dies sicher zu tun, und ich denke, über die Möglichkeit, dass andere Programmierer wird neue abgeleitete Klasse hinzufügen und vielleicht auf eine andere Art und Weise implementieren ... Zum Beispiel:
const std::vector<SomeType>& getVec() const { return std::vector<SomeType>{ arg1, arg2}; }
Ich definierte zurückgegebenen Typ als const reference
, weil ich das Kopieren vermeiden möchte (in dem Fall, wenn Vec
ist ein Mitglied einer Klasse) ... Ist es ok und sicher für die Öffentlichkeit diese Methode? Gibt es irgendwelche Gefahren bei der Rückkehr const reference
?
Das Zurückgeben eines Zeigers/Verweises auf eine Stapelvariable ist ein Fehler. IMO, es hat nichts mit der Gestaltung einer Schnittstelle zu tun. – erenon
Eine Klasse wird verwendet, um a) die Daten und b) den Code, der die Daten verwendet, zusammenzufassen. "Getter" sind ein eindeutiger Beweis für Designfehler ... frage dich selbst "Warum ist der Vektor in diesen abgeleiteten Klassen, und doch ist der Code, der den Vektor verwendet, anderswo? Alternativ frage dich selbst, warum der Code, der diesen Vektor verwendet, nicht mit ist die Daten? –
Siehe auch Martin Fowlers "TellDontAsk" (in diesem Fall erzählen Abgeleitete Klasse ...) –