Frage

Für einige Klassen einer statischen C ++ Bibliothek, die ich verschiedene Schnittstellen für den Benutzer der Bibliothek und für die Bibliothek selbst anbieten möchten.

Ein Beispiel:

class Algorithm {

  public:

    // method for the user of the library
    void compute(const Data& data, Result& result) const;


    // method that I use only from other classes of the library
    // that I would like to hide from the external interface
    void setSecretParam(double aParam);

  private:

    double m_Param;
}

Mein erster Versuch war die externe Schnittstelle als ABC zu erstellen:

class Algorithm {

  public:

    // factory method that creates instances of AlgorithmPrivate
    static Algorithm* create();

    virtual void compute(const Data& data, Result& result) const = 0;
}

class AlgorithmPrivate : public Algorithm {

  public:

    void compute(const Data& data, Result& result) const;

    void setSecretParam(double aParam);

  private:

    double m_Param;
}

Vorteile:

  • Der Benutzer des Algorithmus kann die interne Schnittstelle sehen

Nachteile:

  • Der Benutzer hat eine Factory-Methode zu verwenden, Instanzen erstellen
  • Ich muss gesenkten Algorithmus zu AlgorithmPrivate, wenn ich die geheimen Parameter aus dem Inneren der Bibliothek zugreifen möchten.

Ich hoffe, Sie verstehen, was ich versuche zu erreichen, und ich freue mich auf Ihre Anregungen.

War es hilfreich?

Lösung

Der einfachste Weg, könnte es sein, setSecretParam() private zu machen und die nach einem friend von Algorithm machen:

void setSecretParam(Algorithm& algorithm, double aParam)
{
  void setSecretParam(double aParam);
}

Andere Tipps

Die „üblichen Verdächtigen“ Vererbung zu ersetzen ist Brücke Muster . Sie könnten eine Hierarchie von „Imps“ abgeleitet von der abstrakten Klasse AlgorithmImp definieren und nur geeignete Algorithmen in der Bibliothek Header aus. Dann kann eine Instanz von Algorithmus wie erstellt werden

ConcreteAlgorithm ca1(SomeParam, new LibraryUserAlgorithm());
ConcreteAlgorithm ca2(SomeParam, new InternalAlgorithm());
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top