2012-01-24 13 views
7

Czy można zdefiniować klasę w innych klasach prywatnych i użyć jej do utworzenia tablicy? Na przykład:Jak zdefiniować klasę w innej klasie "prywatna w C++

class a 
{ 
    public: 
    private: 
    class b; 
    b myarray[10]; 

    class b 
    { 
     public: 
     b(int a):a_val (a){} 
     private: 
     int a_val; 
    }; 
}; 

Zignorowanie opinii publicznej, czy jest coś nie tak z moją składnią?

Czy jest również możliwe, aby funkcja członka w A zmodyfikować prywatne wartości b. Na przykład, myarray [0] .a_val = 5; Jeśli tak, to czy ta składnia również jest poprawna?

+0

Jesteś konstruktorem 'b' ma argument' int' zwany 'a' ale masz również klasę o nazwie' a'. to jest mylące. – Foggzie

Odpowiedz

0

Tak, możesz zgłaszać zajęcia prywatnie w innych klasach.

Tak, możesz użyć ich jako typu tablicy, pod warunkiem, że sama klasa jest widoczna w miejscu, w którym tworzysz tablicę.

0

Nie, jest całkowicie w porządku. To po prostu oznacza, że ​​można zadeklarować tylko instancje B do klasy A, który będzie powstrzymać ludzi od robienia:

a::b myB; 

zadeklarować swój B, który jest prawdopodobnie to, co chcesz.

5

Nie, twoja składnia do zdefiniowania prywatnej klasy zagnieżdżonej jest w porządku. Chociaż niektóre inne rzeczy są błędne: Przed utworzeniem tablicy należy zdefiniować b. Typ musi być kompletny.

b nie jest domyślnie constructible więc trzeba także zainicjować tablicę w liście inicjatora a konstruktora, który w rzeczywistości nie jest to możliwe w C++ 03. C++ 11 oferuje listy inicjalizacyjne, aby uzyskać tę funkcjonalność.

Po prostu użyj std::vector lub std::array.

Fixed wersja kodu:

class a 
{ 
public: 
    // ATTN C++11 feature here 
    a() : myarray({ 1, 2}) {} 
private: 
    class b { 
    public: 
    b(int a) : a_val (a){} 
    int a_val; 
    }; 
    b myarray[2]; 
}; 
int main() 
{ 
    a a; 
} 
2

Tak, to jest w porządku, ale trzeba określić zagnieżdżone klasy w pełni przed deklarowania tablicę nim: Tablice mogą być wykonane tylko z kompletnych typów:

class Outer 
{ 
    class Inner { /* define it! */ }; 
    Inner a[100]; 
}; 
Powiązane problemy