【问题标题】:Forward declarations and shared_ptr前向声明和 shared_ptr
【发布时间】:2013-05-16 21:18:50
【问题描述】:

我正在尝试重构我的代码,以便使用前向声明而不是包含大量标头。我是新手,对 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。

【问题讨论】:

    标签: c++ shared-ptr forward-declaration c++98


    【解决方案1】:

    只要您不对它们调用 * 或 ->,共享指针就可以与前向声明的类型一起使用,因此它应该可以简单地编写:-

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

    你当然需要包含&lt;boost/shared_ptr.hpp&gt;

    【讨论】:

      【解决方案2】:

      虽然它会添加一个头文件,但你可以将它放在一个单独的头文件中:

      #include <boost/shared_ptr.hpp>
      
      class IStarter;
      typedef boost::shared_ptr<IStarter> IStarterPtr;
      

      然后将它包含在 IStarter.h 和其他头文件中,避免代码重复(尽管在这种情况下它很小)。

      不过可能有更好的解决方案。

      【讨论】:

        【解决方案3】:

        您不能在 C++98 中前向声明 typedef,所以在这种情况下,我通常会提取我需要的 typedef,然后将它们放入 types.h 文件或类似文件中。这样公共类型代码仍然与类本身的定义分开。

        【讨论】:

          【解决方案4】:

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

          #include <boost/shared_ptr.hpp>
          
          class IStarter;
          typedef boost::shared_ptr<IStarter> IStarterPtr;
          
          // ...
          
          virtual void addStarter(IStarterPtr starter)
          {
                _starter = starter;
          }
          // ...
          IStarterPtr _starter;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-31
            相关资源
            最近更新 更多