12

多くのヘッダーを含める代わりに前方宣言を使用するように、コードをリファクタリングしようとしています。私はこれが初めてで、boost::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;

IStarter.h を含めずに IStarterPtr を前方宣言するにはどうすればよいですか?

関連性がある場合は、C++98 を使用しています。

4

4 に答える 4

12

共有ポインターは、 * または -> を呼び出さない限り、前方宣言された型で機能するため、次のように単純に記述するだけで機能するはずです:-

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

<boost/shared_ptr.hpp>もちろん含める必要があります

于 2013-05-16T13:08:02.157 に答える
2

C++98 では typedef を前方宣言することはできないため、この場合に私が通常行うことは、必要な typedef を取り出してtypes.hファイルに入れるか、同様のことを行います。このようにして、共通型コードはクラス自体の定義から分離されます。

于 2013-05-16T13:13:46.590 に答える
2

ヘッダーファイルを追加しますが、それを別のヘッダーファイルに入れることができます:

#include <boost/shared_ptr.hpp>

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

次に、IStarter.h と他のヘッダーの両方に含めて、コードの重複を回避します (この場合は非常に小さいですが)。

ただし、より良い解決策があるかもしれません。

于 2013-05-16T13:08:51.850 に答える
1

方法はありますが、ブースト ヘッダーをファイルに含める必要があります。

#include <boost/shared_ptr.hpp>

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

// ...

virtual void addStarter(IStarterPtr starter)
{
      _starter = starter;
}
// ...
IStarterPtr _starter;
于 2013-05-16T13:12:41.877 に答える