2012-05-13 15 views
5

Powiel możliwe:
Forward declaration of nested types/classes in C++Czy istnieje sposób, aby wstępnie ustalić klasy zagnieżdżone w C++?

Dla prostych odsyłaczy klas jest to wykonalne do predeclare z classnames i używać go jako odniesienie. W ten sposób reprezentacja jest wskaźnikiem. Ale na wypadek, gdybym chciał odwołać się do zagnieżdżonej klasy obu (patrz przykład poniżej), wpadnę w kłopoty, ponieważ wydaje się, że nie ma możliwości uprzedniego odgadnięcia klasy zagnieżdżonej.

Moje pytanie brzmi: czy istnieje sposób uprzedniego ustalenia klas zagnieżdżonych, aby mój przykład zadziałał?

Jeśli nie: czy istnieje wspólne obejście tego problemu, które nie powoduje zbytniego uszkodzenia kodu?

// Need to predeclare it to use it inside 'First' 
class Second; 
class Second::Nested; // Wrong 

// Definition for my 'First' class 
class First 
{ 
public: 
    Second::Nested* sested; // I need to use the nested class of the 'Second' class. 
          // Therefore I need to predeclare the nested class. 
    class Nested { }; 
}; 

// Definition for my 'Second' class 
class Second 
{ 
public: 
    First::Nested* fested; // I need to use the nested class of the 'First' class. 
          // This is okay. 
    class Nested { }; 
}; 
+0

OK - Gdybym szukał "zadeklarować", znalazłbym tę odpowiedź. (To nie jest możliwe.) To właśnie to. Dzięki. Ale na razie myślę o obejściu. Unnesting konflikty z inną 'klasą zagnieżdżoną 'mojej przestrzeni nazw. A zmiana nazwy zaciemni użytkownika interfejsu. –

Odpowiedz

4

Krótko mówiąc, odpowiedź brzmi: nie.

Ale trzeba spojrzał najpierw na similar question ...

EDIT: możliwe obejście może być owijania zarówno zajęcia w innej klasie, i przekazuje delcaring zagnieżdżonych klas wewnątrz owijki.

class Wrapper 
{ 
public: 

    // Forward declarations 
    class FirstNested; 
    class SecondNested; 

    // First class 
    class First 
    { 
    public: 
     SecondNested* sested; 
    }; 

    // Second class 
    class Second 
    { 
    public: 
     FirstNested* fested; 
    }; 
}; 

W ten sposób będziesz mieć do wdrożenia Wrapper::A i Wrapper::B jednocześnie izolując je od nazw cokolwiek masz imlpementing.

+0

Sprawdziłem to pytanie, ale nie ma rozwiązania, ale niepotrzebne. Jestem pewien, że musi istnieć inny - lepsze rozwiązanie tego problemu. Coś jak wzór, który nie zakłóca relacji z klasami. –

+0

Wygląda dobrze dla przykładu powyżej. W tym przypadku akceptuję to. Ponadto nadal będę musiał znaleźć inne rozwiązanie, ponieważ muszę wielokrotnie wykonywać takie przekierowania, tak że nie mogę umieścić wszystkich moich klas w klasie otoki. Myśląc o zagnieżdżonej klasie wewnątrz klasy zagnieżdżonej, to znowu nie jest rozwiązanie. –

+0

Będziesz musiał utworzyć wspólne klasy dla takich przypadków, nie ma innej opcji (lub ponownego przemyślenia projektu). –

Powiązane problemy