Frage

Was für im Bereich Menschen hier verwenden C ++ Zusammenfassung Basisklassenkonstruktoren tun? Ich spreche über reine Schnittstellenklassen keine Datenelemente aufweisen und keine nicht-rein virtuelle Mitglieder.

Kann jemand irgendwelche Idiome demonstrieren, das ABC Konstrukteure in nützlicher Weise zu verwenden? Oder ist es nur wesentlich für die Art ABCs der Verwendung von Schnittstellen zu implementieren, die sie bleiben leer, Inline- und geschützt?

War es hilfreich?

Lösung

  

Kann jemand irgendwelche Idiome demonstrieren, das ABC Konstrukteure in nützlicher Weise zu verwenden?

Hier ist ein Beispiel, obwohl es ein erfundenes, ungewöhnlich Beispiel.

Sie können es verwenden, um eine Liste aller Instanzen zu halten:

class IFoo
{
private:
  //static members to keep a list of all constructed instances
  typedef std::set<IFoo*> Set;
  static Set s_set;

protected:
  //new instance being created
  IFoo()
  {
    s_set.insert(this);
  }

public:
  //instance being destroyed
  virtual ~IFoo()
  {
    s_set.remove(this);
  }

  ... plus some other static method and/or property
      which accesses the set of all instances ...
};
  

Oder ist es nur wesentlich für die Art ABCs der Verwendung von Schnittstellen zu implementieren, die sie bleiben leer, Inline- und geschützt?

Weitere in der Regel sind sie nur überhaupt nicht erklärt! Es gibt keinen Grund, sie zu erklären:

  • Leere und inline => warum die Mühe, es zu erklären?
  • Protected => das ABC wahrscheinlich schon hat einige rein virtuelle Methoden und kann daher bereits nicht nur als Unterklasse instanziiert werden.

Andere Tipps

Nehmen wir an, dass es einige Verhalten, das für alle abgeleiteten Klassen üblich ist. Wie sich in einer externen Registrierung Registrierung und ihre Gültigkeit etwas zu überprüfen.

All dieser gemeinsame Code kann in der Basisklasse Konstruktor gesetzt werden, und es wird implizit von den Konstrukteuren von jedem der abgeleiteten Klassen aufgerufen werden.

Wie könnte eine abstrakte Konstruktor der Basisklasse für alles verwendet werden?

Angenommen, Sie eine abstrakte Basisklasse B und eine abgeleitete Klasse D. Wenn ein Objekt vom Typ D erstellt wird, wird B Konstruktor zuerst genannt, aber an diesem Punkt wurde das Objekt „ist“ nach wie vor vom Typ B (siehe hier ) - insbesondere, ruft alle virtuellen Funktionen aus der Körper von B Konstruktor ruft B eigene Implementierungen diese Funktionen. Aber wenn B eine reine abstrakte Klasse ist, keine dieser virtuellen Funktionen definiert werden, so wird das Programm sofort zum Absturz bringen.

Ich vermute, dass Sie für B Konstruktor soll die meisten abgeleitete-Klasse (zum Beispiel D) Implementierung einer virtuellen Funktion aufzurufen, nach unten, nicht wahr? Das wäre eine schlechte Idee im Allgemeinen, weil D's Objekt ist noch nicht vollständig aufgebaut, so dass jeder Zugriffe auf Membervariablen in D von innen D's Implementierung der virtuellen Funktion würde uninitialised Speicher zugreifen.

Denken Sie daran:. "Ressourcenerfassung ist Initialisierung"

Manchmal verwenden wir abstrakte Basisklassen als eine Art von Verriegelungsmechanismus. Zum Beispiel wird in einer Multi-Threaded-Umgebung, in der mehrere Threads müssen eine einzelne Ressource zu teilen, kann ein Thread den Konstruktor als eine Möglichkeit, auf die Ressource, und den Destruktor zu erwerben, die Ressource freizugeben

void PlayWithPaintBallGun(Target &target)
{
    PaintBallGun paintBallGun;    // constructor waits until the gun is free,
                                  // then picks it up.

    paintBallGun.Aim(target);     // Shoot something
    paintBallGun.Fire();          //

                                  // Clever! The destructor is automatically
                                  // called when it goes out of scope. So we
                                  // can't forget to put the gun down.
}

Hugo

Ich kann nicht von vielen nützlichen Beispielen denken. Eine Klasse ohne Daten Mitglieder hat keinen Zustand und somit nichts initialisieren. Sie können haben die Konstruktor / Destruktor für Sie tun Protokollierung, though. Um zum Beispiel die Schaffung / Vernichtung aller Besucher Objekte zu protokollieren:

class Visitor {
public:
    Visitor() {
        std::cout << "Visitor@" << this << " created" 
                  << std::endl;
    }

    virtual ~Visitor() {
        std::cout << "Visitor@" << this << " destroyed" 
                  << std::endl;
    }

    virtual void visitA(A*) = 0;
    virtual void visitB(B*) = 0;
    // ...
};

in der Regel seine ausschließlich Mitglieder auf sinnvolle Werte zu initialisieren.

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