2013-05-16 6 views
8

Я пытаюсь реорганизовать свой код, чтобы использовать форвардные объявления вместо включения большого количества заголовков. Я новичок в этом вопросе и задаю вопрос о boost :: shared_ptr.Передовые декларации и shared_ptr

Скажем, у меня есть следующий интерфейс:

#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 

Я тогда функцию в другом классе, который принимает объект IStarterPtr в качестве аргумента, скажем:

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

как я вперед объявить IStarterPtr без в том числе IStarter.h?

Я использую C++ 98, если это имеет значение.

ответ

7

Shared указатели работают с вперед объявленные типы тех пор, пока вы не звоните * или -> на них так, он должен работать, чтобы просто написать: -

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

Вам нужно включить <boost/shared_ptr.hpp> конечно

2

Хотя было бы добавить файл заголовка, вы можете поместить это в отдельный файл заголовка:

#include <boost/shared_ptr.hpp> 

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

, а затем включить его как в IStarter.h и в другом заголовке вашего, избегая сотрудничества (хотя в этом случае он довольно мал).

Однако могут быть лучшие решения.

1

Существует способ, но вы должны включить заголовок повысить в файле:

#include <boost/shared_ptr.hpp> 

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

// ... 

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

Вы не можете вперед объявить в C определений типов ++ 98, так что я обычно делаю в этом случае вытащить typedefs мне нужно положить их в файл types.h или что-то подобное. Таким образом, общий код типа все еще отделен от определения самого класса.

Смежные вопросы