Frage

Was ist der beste Weg, um eine Container-Klasse oder eine eine andere Klasse innerhalb einer Klasse als privat oder öffentlich-Mitglied zu setzen?

Anforderungen:

1.Vector in meiner Klasse

2.Add und Zählung von Vektor ist erforderlich Schnittstelle

War es hilfreich?

Lösung

Wenn der Zustand des Behälters ein Teil der Klasse unveränderlich ist, dann sollte es, wenn möglich, sein privat.

Zum Beispiel, wenn der Behälter stellt einen dreidimensionalen Vektor dann Teil der Invarianten sein könnte, dass es immer genau 3 Zahlen enthält. es als öffentliches Mitglied freilegen würde Code außerhalb der Klasse des Behälters Größe zu ändern, was wiederum könnte Probleme für jede Routine verursachen, die die Behältergröße erfordert konstant sein kann. Die Behälter mit privaten Grenzen die Orte in der Software, wo die Größe des Behälters des Mitglieds Klasse Funktionen geändert werden können.

Andere Tipps

Ob ein Mitglied Privat deklariert wird oder öffentliche hängt ganz von Ihrer Anwendung. Könnten Sie etwas ausführlicher geben?

Ein wichtiger Punkt bei der Erklärung Ihrer Mitglied ist, dass, wenn Sie einen „Getter“ zur Verfügung stellen, um es abzurufen, dann sind Sie nicht mehr das Objekt eingekapselt wird. Stattdessen kann es gut sein, Wrapper-Methoden zu schreiben, nur die Funktionalität auszusetzen Sie verfügbar machen möchten.

Zum Beispiel mit einem Vektor-Mitglied, erhalten Sie möglicherweise eine AddItem und Clear-Methode schreiben, wenn das alles ist die Funktionalität, die Sie mögen aus.

Da Sie über eine Klasse sprechen, halte ich es privat sein sollte. Wenn Sie es öffentlich sein wollen, sondern eine Struktur schaffen -., Um es offensichtlich, dass Sie die wollen Mitglieder Variablen verwendet werden

eine gangbare Alternative zu den vector Mitglied ausgesetzt wird ist die Schaffung eines Besuchers Funktion (oder einen internen Iterator). So kann man das Gesetz von Demeter gehorchen besser:

class ContWrapper {
    std::vector<int> _ints;
public:
    class Action {
    public: 
        virtual void accept( int i ) = 0;
    };
    void each_int( Action& a );
};

Seien Sie auch sehr vorsichtig beim Export z.B. ein std::vector<T> aus einer Bibliothek auch: der Client-Code möglicherweise nicht die gleiche STL-Implementierung verwenden, wie Sie getan haben, so dass das Layout dieser Elementvariablen unterscheiden

Machen Sie alle Mitglieder privaten und Methoden verwenden, Accessor, dies ermöglicht es Ihnen, die Umsetzung zu einem späteren Zeitpunkt zu ändern. Nur in sehr ungewöhnlichen Umständen würde ich machen alle Daten, Mitglied Öffentlichkeit.

Beachten Sie, dass die Umsetzung chaning passiert öfter als man sich vorstellen kann, es ist nicht nur ein Fall von der Art des Behälters ändern, aber vielleicht möchten Sie den Mechanismus ändern. Sagen Sie bitte Namen in einer Liste wurden speichern, nach einer Weile Sie diese Liste zu Index mit einem Hash wählte können und möchten die Hash jedes Mal, wenn Sie einen neuen Namen hinzufügen, aktualisiert haben. Wenn Ihre Implementierung geeigneter Weise verkapselt ist dies zu tun ist leicht, wenn man nur den Vektor ausgesetzt würden Sie Änderungen vornehmen müssen, die die Schnittstelle anpassen (und so wird die Änderung kräuseln out).

Wenn diese neue neu haben Sie gelesen von: http: // en.wikipedia.org/wiki/Encapsulation_(classes_-_computers)

Es gibt einen dritten Weg - manchmal ist es besser, aus dem Behälter erben und überschreibt es Methoden ist Ihr Ziel (zB Thread-Sicherheit) zu erreichen. Wie dem auch sei, so dass es fast immer öffentlich ist keine gute Idee.

In Anbetracht, dass Sie den Container kapseln wollen in einer anderen Klasse bedeutet, dass es nicht öffentlich sein, und auch die Öffentlichen Methoden der Klasse sollen nichts Implementierung spezifische um den Behälter aus. Auf diese Weise die Umsetzung Ihrer Klasse (das heißt der Container) ohne Änderung seiner Oberfläche verändert werden.

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