Sdílet prostřednictvím


Vnořené deklarace tříd

Třída může být deklarována v rámci jiné třídy.Tato třída se nazývá "vnořená třída". Vnořené třídy jsou považovány za součást rozsahu ohraničující třídy a jsou k dispozici pro použití v daném oboru.Pro odkazování na vnořenou třídu z jiného oboru, než její ohraničující obor, je třeba použít plně kvalifikovaný název.

Následující příklad ukazuje, jak deklarovat vnořené třídy:

// nested_class_declarations.cpp
class BufferedIO
{
public:
   enum IOError { None, Access, General };

   // Declare nested class BufferedInput.
   class BufferedInput
   {
   public:
      int read();
      int good()
      {
         return _inputerror == None;
      }
   private:
       IOError _inputerror;
   };

   // Declare nested class BufferedOutput.
   class BufferedOutput
   {
      // Member list
   };
};

int main()
{
}

BufferedIO::BufferedInput a BufferedIO::BufferedOutput jsou deklarovány v BufferedIO.Tyto názvy tříd nejsou viditelné mimo obor třídy BufferedIO.Objekt typu BufferedIO však neobsahuje žádné objekty typu BufferedInput nebo BufferedOutput.

Vnořené třídy mohou přímo použít názvy, názvy typu, názvy statických členů a enumerátory pouze z nadřazené třídy.Pro použití názvů ostatních členů třídy je nutné použít odkazy nebo názvy objektů.

V předchozím příkladu BufferedIO lze k enumerátoru IOError přistupovat přímo pomocí členské funkce vnořených tříd BufferedIO::BufferedInput nebo BufferedIO::BufferedOutput, jak je uvedeno ve funkci good.

[!POZNÁMKA]

Vnořené třídy deklarují pouze typy v rámci oboru třídy.Nezpůsobují vytvoření obsažených objektů vnořené třídy.Předchozí příklad deklaruje dvě vnořené třídy, ale nedeklaruje žádné objekty těchto typů tříd.

Výjimka deklarace viditelnosti oboru se objeví, je-li název typu deklarován spolu s dopřednou deklarací. Název třídy, která je deklarována dopřednou deklarací, je v tomto případě viditelný mimo ohraničující třídu, kde je její obor působnosti nejmenším ohraničujícím netřídním oborem. Příklad:

// nested_class_declarations_2.cpp
class C
{
public:
    typedef class U u_t; // class U visible outside class C scope
    typedef class V {} v_t; // class V not visible outside class C
};

int main()
{
    // okay, forward declaration used above so file scope is used
    U* pu;

    // error, type name only exists in class C scope
    u_t* pu2; // C2065

    // error, class defined above so class C scope
    V* pv; // C2065

    // okay, fully qualified name
    C::V* pv2;
}

Viz také

Referenční dokumentace

Třídy, struktury a spojení