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

有一种方法,但您需要在文件中包含 boost 标头:

#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 回答