2013-05-16 17 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ファイル、またはそれに類するものに入れる必要があるtypedefs。そうすれば、共通型コードは依然としてクラス自体の定義から分離されます。