前向声明和shared_ptr

13

我试图重构我的代码,使用前向声明而不是包含大量头文件。我对此很陌生,并且有关于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个回答

13

只要不在前置声明类型上调用 * 或 ->,共享指针就可以使用,因此简单地编写以下内容应该可以正常工作:

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和其他头文件中都包含它,避免代码重复(尽管在这种情况下它相当小)。

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


2

在C++98中,您无法前向声明typedefs。因此,在这种情况下,我通常会将所需的typedefs提取出来并放入types.h文件或类似的文件中。这样,公共类型代码仍然与类本身的定义分离。


1

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

#include <boost/shared_ptr.hpp>

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

// ...

virtual void addStarter(IStarterPtr starter)
{
      _starter = starter;
}
// ...
IStarterPtr _starter;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接