2013-05-16 51 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

共享指針工作,向前聲明類型,只要你不叫*或 - >上他們,所以它應該工作,以簡單的寫: -

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所以我通常在這種情況下是聲明的typedef拔出我需要的類型定義將它們放入types.h文件或類似的東西。這樣,通用類型代碼仍然與類本身的定義分離。