Frage

Angenommen, ich habe folgende Erklärung ab:

class Over1
{
   protected:
      class Under1
      {
      };
};

Ich weiß, dass ich folgendes tun können:

class Over2 : public Over1
{
   protected:
        class Under2 : public Under1
        {
        };
};

Aber ist es eine Möglichkeit, Under2 ohne Over2 zu erklären?

Da Sie müßten over1 erweitern jedes Derivat von Under1 zu verwenden, dies mag albern, aber in dieser Situation könnte es 30 verschiedene Varianten von Under sein. Ich kann entweder:

  • sie alle innerhalb over1 Put: Nicht nur attraktiv, da Over2 verwenden 1 oder 2 von ihnen
  • Setzen Sie sie sich in ihre eigene Version von Over: Nicht attraktiv, da dann müssen Sie zu multiplizieren, vererben fast die selbe Klasse.
  • Finden Sie einen Weg zu schaffen, Kinder von Under1 ohne die Schaffung Kinder von over1

So ist das möglich?

Danke.

War es hilfreich?

Lösung

Die Verwendung von Vorlagen und explizite Spezialisierungen können Sie dies mit nur einem zusätzlichen Klassendeklaration in over1.

class Over1
{
protected:
  class Under1
  {
  };

  template <typename T>
  class UnderImplementor;
};

struct Under2Tag;
struct Under3Tag;
struct Under4Tag;

template <>
class Over1::UnderImplementor<Under2Tag> : public Over1::Under1
{
};

template <>
class Over1::UnderImplementor<Under3Tag> : public Over1::Under1
{
};

template <>
class Over1::UnderImplementor<Under4Tag> : public Over1::Under1
{
};

Hope, das hilft.

Andere Tipps

Besser als verschachtelte Klassen erstellen, können Sie auf die Einbettung dieser closses in einem Namensraum zu suchen. Auf diese Weise brauchen Sie nicht die äußere Klasse, um die innere Klasse zu erhalten. Es gibt einige große Argumente für und gegen die Google C ++ Style Guide .

Wenn Sie Under1 geschützt, dann per Definition behalten möchten, müssen Sie von over1 erben, darauf zuzugreifen. Ich würde vorschlagen, Under1 öffentlich zu machen, oder unter Verwendung von Namensräumen wie Douglas vorgeschlagen.

Ich habe nicht den Compiler diese jetzt zu testen, also bin ich nicht sicher, dass diese funktionieren würde, aber man könnte versuchen, diese:

class Over1
{
   protected:
      class Under1
      {
      };

   public:
      class Under1Interface : public Under1 
      {
      };
};

class Under2 : public Over1::Under1Interface
{
};

Oder vielleicht so etwas wie folgt aus:

class Over1
{
   protected:
      class Under1
      {
      };
};

class Under2 : private Over1, public Over1::Under1
{
};

Oder auch:

class Under2;

class Over1
{
   friend class Under2;

   protected:
      class Under1
      {
      };
};

class Under2 : public Over1::Under1
{
};

Obwohl das würde alle Over1s Gemeinen zu Under2 aussetzen -. Wahrscheinlich nicht etwas, was Sie wollen würde

Klingt wie ein bisschen einen flippigen Entwurf zu mir. Warum nicht versuchen, Ihren Code anders zu strukturieren. Ich denke, dies ist möglicherweise ein guter Kandidat für das Decorator-Muster sein könnte, wo Sie Ihre Basisklasse in verschiedenen Dekorateure wickeln konnte die gewünschte Funktionalität, die verschiedenen Aromen von ‚unter‘ sein könnte Dekorateure zu erreichen. Nur ein Gedanke, schwer zu sagen, ohne mehr über die Absichten des Codes zu kennen.

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