Frage

Manchmal brauche ich einige der Teilnehmer, belichten. Zum Beispiel in dem folgende Beispiel class Mechanic kann die direkten Zugriff auf Engine Komponente benötigen. Ich habe viele Male gelesen, dass alle Felder sollten aus verschiedenen Gründen von Mutator (Accessor) Methoden zugegriffen werden. Aber gibt es einen Vorteil bei der Bereitstellung nicht konstante Referenz Getter:

class Car
{
    public:
        Engine & engine()
        {
           return m_engine;
        }

        //as a consequence you will also need to provide const version
        const Engine & engine() const
        {
           return m_engine;
        }

    private:
       Engine m_engine;
}

über einfach zu machen Maschinenkomponente öffentlich:

class Car
{
    public:
        Engine engine;
}

Sie können auch public mit protected ersetzen, wenn Sie wie in diesem Beispiel nicht. Im wirklichen Leben haben Sie etwas simillar in Java, wenn es um System.in oder System.out kommt. Es sieht aus wie zu sein, voll kompatibel, was manche Leute sagen, müssten Sie Anrufe wie System.getInstance().getOut().println("hello world") auszuführen. Ich sehe keinen Nutzen außer vielen bürokratischen Code in solchen Fällen.

War es hilfreich?

Lösung 5

Ich habe festgestellt vernünftigen Punkt solche Getter vorzusehen. Es macht die Integration der Software einfacher (zum Beispiel, wenn Sie Schnittstelle in eine andere Sprache zu übersetzen und binden ABIs).

Andere Tipps

Sie können nützlich sein, wenn der Wert, den Sie zurückkehren, tatsächlich auf dem Heap ist.

template<class T> class Singleton
{
private:
    static T* m_pSingleton;

public:
    T& getSingleton() { assert(m_pSingleton); return(*m_pSingleton); };

}; // eo class Singleton

Explicit Getter und Setter können übermäßig bürokratisch; es hängt von Ihrer Situation.

Der Haupt genannte Grund für Getter und Setter-Funktionen ist, dass es die Kunden Ihrer Klasse von möglichen Änderungen bei der Umsetzung in der Zukunft (zum Beispiel isoliert, überlegt, was passieren würde, wenn Sie sich entscheiden, ein Engine Objekt auf Nachfrage zu generieren (eher eine Membervariable) oder entscheiden sie sich hinter einem intelligenten Zeiger zu verbergen, oder einen anderen Behälter als verwenden).

Wenn Sie Ihre Klasse, wenn sehr einfach (zB in der Nähe ist ein POD ) und wahrscheinlich auch nicht ändern , dann kann es nicht wert sein, die faff der mit den Getter und Setter zu implementieren.

Allerdings Ihre Frage zu beantworten, ein nicht-const Getter wahrscheinlich machen nicht viel Sinn. Ihr Getter Prototyp sollte Engine & engine() const sein; sonst werden Sie nicht in der Lage sein, es Objekte auf const Car zu nennen.

Ein Vorteil einen Getter bereitzustellen, besteht darin, dass, wenn und wenn Sie sich entscheiden, wie die Getter Werke zu ändern, den Code, der diese Klasse Bedarf verwendet nicht neu kompiliert werden. Aber wenn Sie einen öffentlichen Bereich haben und später entscheiden, einen Getter zu machen, sollte der gesamte Code neu kompiliert werden. Sonst habe ich keine ernsthaften praktischen Grund nicht sehen Sie Ihre Variable privat zu machen. Beachten Sie jedoch, dass dies alles gilt genau dann, wenn Sie einen Weg für äußereen Anwender zur Verfügung zu stellen haben einen Verweis auf den Motor zu bekommen. Wenn es möglich ist, die Software so zu gestalten, dass dies überhaupt beseitigt werden muß, das wäre besser.

Wie ich vor kurzem erhalten gebildet auf zufällig, Getter und Setter riechen schlechtes Design. Aber, wenn Sie es so wollen, Funktionen bereitstellen zu bekommen und Set m_engine (Definiert von Ihnen), anstatt es nur auszusetzen (Sie haben keine Intervention) bedeutet, dass Sie ein Plug-in haben Punkt für zukünftige Änderungen.

Für mich macht es Sinn, hier:

image(i,j) = 234;

Statt darüber nachzudenken, über private Mitglieder einer Klasse auszusetzen denken mehr nach dem Vorbild von Methoden, die auf diesen Klassen aufrufen. Ich las einen interessanten Java Artikel, Warum Getter und Setter-Methoden sind das böse , die genauso viel zu C ++ gilt ebenso wie für Java.

ja, es macht Sinn - für Wartbarkeit, Validierung und Konsistenz

.

Sie können viele Aspekte der Klasse in der Zukunft ändern müssen, einen Accessor Bereitstellung helfen Bruch der Client-Code zu minimieren.

können Sie alle Validierungslogik geben Sie brauchen hier, dass der Motor, um sicherzustellen, ein gültiger Zeiger ist, ist nicht in einem unbrauchbaren Zustand, etc.

schließlich wird Ihr Code konsistent sein: Sie müssen nicht den Header öffnen Sie das Mitglied Sichtbarkeit zu wissen - man muss nur immer wissen. Dies ist auch nützlich, mit Vorlagen.

In diesem Fall würden Sie eher eine Car.fix(const Mechanic&) Funktion benötigen, die dann den Motor mit dem Mechanic gibt, sagen:. Engine.fix(const Mechanic&), wie ich den Zustand des Engine annehmen, werden geändert

Die ursprüngliche Idee Klassen mit zusammen war, die Daten mit seinen Accessorfunktionen zu binden. Wenn Sie Setter oder Getter tun, die lediglich eine interne Daten zurückgibt, bedeutet dies, dass Ihre Daten nicht zusammen mit seiner Zugriffs Funktionalität gebunden ist: Ihre Klasse nicht abgeschlossen ist.

Sie wollen nur aussetzen neue Daten, die eine Klasse aussendet . Sprich Car.get_exhaust() und die Car nicht den Auspuff hat, erzeugt es nur, wenn Sie so fragen. ;)

oder Fire Riefle.fire() während kein Zugriff für Riefle::Trigger wird wie so vom Mechaniker festgesetzt: Trigger.fix_by(Mechanic) und dann wird das fix_by sagen Mechanic.add_working_hour(0.5) nennen. XD

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top