2011-06-22 7 views
12

Mój problem:przodu deklaracji i przestrzenie nazw (C++)

Got dwie klasy, klasy A i B, więc mam A.H i A.cpp i B.H. i B.cpp. musi wiedzieć, B i B musi wiedzieć A. Rozwiązałem to w następujący sposób (nie wiem, dlaczego to musi być tak ...)

AH:

#include "B.h" 
class A{ ... 

A. cpp:

#include "A.h" 

Bh:

#include "A.h" 
class A; // forward declaration 
class B { ... 

B.cpp:

#include "B.h" 

Użyłem jednej deklaracji i działa.

Problem polega na tym, że obie klasy muszą znajdować się w przestrzeni nazw "ui". Albo przynajmniej myślę, że to jest sens:

A.H:

#include "B.h" 
namespace ui{ 
    class A; 
} 

class A{ ... 

B.H.:

#include "A.h" 
namespace ui{ 
    class B; 
} 

class B{ ... 

To już nie działa. Co muszę teraz zrobić, aby działało ponownie z przestrzenią nazw i deklaracją przekazania?

Oba muszą znajdować się w tym obszarze nazw. Pracuję z Qt i potrzebne są linie "namespace ui". Obie klasy muszą się znać. Próbowałem już tylko, aby w ten sposób:

namespace ui{ 
class A; 
class B; 
} 

zarówno nagłówki, ale to nie działa ...

Btw: Wszystkie Header-Files dostał także "IFNDEF" -mechanism.

+3

Co oznacza "To już nie działa." Proszę podać dokładne błędy kompilatora/łącznika – fredoverflow

Odpowiedz

6
// A.h 
namespace ui { 
    class A; // forward 
    class B { 
    }; 
} 



// B.h 
namespace ui { 
    class B; // forward 
    class A { 
    }; 
} 



// A.cpp 
#include "A.h" 
#include "B.h" 



// B.cpp 
#include "A.h" 
#include "B.h" 
3

Już prawie jesteś. To powinno działać:

// A.h 
namespace ui { 

class B; 
class A { 
    ... 
}; 

} // namespace ui 

i

// B.h 
namespace ui { 

class A; 
class B { 
    ... 
}; 

} // namespace ui 

Jedyne co masz źle, że trzeba zdefiniować klasy wewnątrz przestrzeni nazw; nie wystarczy przekazywać dalej - deklaruj je wewnątrz przestrzeni nazw.

+0

Nie mogę tego zrobić Jest to automatycznie wygenerowany tekst przez QT- Projektant: Po prostu to robi Nie wiem dlaczego Btw także w moim pierwszym przykładzie, który deklarowałem jako działający Potrzebuję również dwóch deklaracji forwardowych – Obs

+0

Być może zauważyłeś, że masz trzy odpowiedzi, które mówią prawie dokładnie to samo? Jeśli nie można przekonać programisty QT-Designer do umieszczenia definicji klas w bloku "' namespace ui {'...'} '", to utkniesz w tych klasach globalna przestrzeń nazw. – zwol

13

Jeśli rozumiem cię, zadeklarować 2 różne rodzaje z takim konstruktem:

#include "B.h" 
namespace ui{ 
    class A; 
} 

class A{ ... }; 

Tu podaje, że istnieje class A w przestrzeni nazw ui, ale można zdefiniować class A w globalnej przestrzeni nazw. Dlatego też zadeklarowano ui::A, ale nigdy nie określono.Przesuń definicję A do nazw ui także:

#include "B.h" 
namespace ui{ 
    class A; 
} 

//somewhere later: 
namespace ui 
{ 
    class A{ ... }; 
} 
0

Jest to bardzo specyficzne Qt pytanie.

Gdy program Qt Designer automatycznie generuje plik kodu, przestrzeń nazw Ui jest oddzielną przestrzenią nazw od klas. W rzeczywistości deklarowane są dwie różne klasy: class A w globalnej przestrzeni nazw i class Ui::A w przestrzeni nazw Ui. Druga klasa zawiera wszystkie formanty, które Qt generuje dla ciebie (kiedy używasz projektanta formularzy), a pierwsza klasa (w globalnej przestrzeni nazw) ma całą twoją logikę.

Wersja Qt Creator używam (3.1) będzie również wygenerować Prywatny członek dla class A (nie Ui::A): private: Ui::A* ui;, który jest konfiguracja z ui->setUp(this). Następnie można uzyskać dostęp do elementów sterujących (np. ui->lineEdit->toPlainText();.