2009-05-07 15 views
9

Próbuję uprościć plik nagłówkowy "include spaghetti" za pomocą deklaracji forward i przenoszenia #includes do pliku implementacji. Jednak nadal pojawia się następujący scenariusz:Przekaż dalej publicznie typedef class w C++

//Foo.h 
#include "Bar.h" 

class Foo 
{ 
public: 
    void someMethod(Bar::someType_t &val); 
}; 

//Bar.h 
. 
. 
. 
class Bar 
{ 
public: 
    typedef std::vector<SomeClass> someType_t; 
}; 

Chcę usunąć #include "Bar.h" w tylu przypadkach, jak to możliwe. Widzę również sytuację, w której typedef w Bar.h znajduje się poza klasą Bar. Zakładam, że obie sytuacje można rozwiązać w ten sam sposób.

Wszelkie pomysły?

+0

Czy Bar jest rzeczywiście klasą lub szablonem? Odpowiedzi będą się różnić, jeśli Bar jest szablonem, czyli jeśli Bar nie jest unikalny, a więc Bar :: someType_t nie jest unikalny. –

Odpowiedz

8

Niestety, nie masz wielu możliwości wyboru i żaden nie jest doskonały.

pierwsze, dwa oczywiste i nie do przyjęcia rozwiązania:

  • można przekazać zadeklarować typedef który całkowicie pokonał cel za pomocą typedef.
  • Dołączasz plik zawierający typedef, którego chcesz uniknąć.

bardziej interesujące rozwiązania:

  • mieć wszystkie związane typedef S w tym samym obejmować i obejmują ten plik. Tworzy to połączenie kodu między klasami. Powinieneś to zrobić tylko z powiązanymi klasami, w przeciwnym razie skończysz z plikiem boga, co może prowadzić do wielu rekompilacji po dodaniu do tego pliku typedef.
  • W każdej klasie należy osobny dodatek z numerem typedef. Trochę irytujące, ale działa.

Te dwie ostatnie są jak sporządzenie deklaracji forward, ale z dodanymi typedef s. Zmniejszają współzależności plików, ponieważ rzadko modyfikujesz plik typedef.

Powiedziałbym, że w większości sytuacji centralny element zawiera najwięcej korzyści dla kłopotów. Tylko bądź ostrożny.

+1

Myślę, że mogę wykonać czwartą opcję: - Zadeklaruj dokładnie ten sam typedef w Foo.h Moje rozumowanie jest takie, że Foo prezentuje swój własny interfejs klientom i jest odpowiedzialny za to, jak nazywa się własne metody. Oprogramowanie klienckie nie będzie musiało zawierać paska bar.h ani żadnej wiedzy na jego temat. Ten poziom enkapsulacji i niskiego sprzężenia jest celem, do którego dążę. –

+0

Ups. Chciałem powiedzieć 5 opcję. –

-2

Po prostu użyj class Bar;. To mówi C++, że deklarujesz zamiar zdefiniowania paska.

+1

Zanotuj typedef wewnątrz 'paska klasy' ... to jest prawdziwy problem, a nie sama klasa, do której można się odnieść za pomocą deklaracji, którą zasugerowałeś. – Naaff