2013-05-16 15 views
8

Próbuję refaktoryzacji mojego kodu, tak aby używać deklaracji przekazania zamiast zawierać wiele nagłówków. Jestem na tym początku i mam pytanie dotyczące boost :: shared_ptr.Deklaracje przekazywania i shared_ptr

Say mam następujący interfejs:

#ifndef I_STARTER_H_ 
#define I_STARTER_H_ 

#include <boost/shared_ptr.hpp> 

class IStarter 
{ 
public: 
    virtual ~IStarter() {}; 

    virtual operator()() = 0; 
}; 

typedef boost::shared_ptr<IStarter> IStarterPtr; 

#endif 

Mam następnie funkcję w innej klasy, która przyjmuje obiekt IStarterPtr jako argument, powiedzmy:

virtual void addStarter(IStarterPtr starter) 
{ 
    _starter = starter; 
} 
... 
IStarterPtr _starter; 

jak mogę do przodu zadeklarować IStarterPtr bez w tym IStarter.h?

Używam C++ 98, jeśli ma to znaczenie.

Odpowiedz

7

Shared wskaźniki pracy z przodu zadeklarowane typy tak długo, jak nie nazwać * lub -> na nich więc powinien działać po prostu napisać: -

class IStarter; 
typedef boost::shared_ptr<IStarter> IStarterPtr; 

Trzeba to <boost/shared_ptr.hpp> oczywiście

2

choć byłoby dodać plik nagłówka, który można umieścić w osobnym pliku nagłówka:

#include <boost/shared_ptr.hpp> 

class IStarter; 
typedef boost::shared_ptr<IStarter> IStarterPtr; 

a następnie włączenia go zarówno w IStarter.h i w drugim nagłówkiem, unikając współpracy duplikacja (choć w tym przypadku jest dość mała).

Możliwe, że istnieją lepsze rozwiązania.

1

Jest droga, ale trzeba zawierać nagłówek doładowania w pliku:

#include <boost/shared_ptr.hpp> 

class IStarter; 
typedef boost::shared_ptr<IStarter> IStarterPtr; 

// ... 

virtual void addStarter(IStarterPtr starter) 
{ 
     _starter = starter; 
} 
// ... 
IStarterPtr _starter; 
1

Nie możesz przodu zadeklarować typedefs w C++ 98, więc to, co zwykle zrobić w tym przypadku jest wyciągnąć typedefs, których potrzebuję, umieść je w pliku types.h lub coś podobnego. W ten sposób wspólny kod typu jest nadal oddzielony od definicji samej klasy.