我正在尝试重构我的代码,以便使用前向声明而不是包含大量标头。我是新手,对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,如果这是相关的。
答案 0 :(得分:8)
只要您不调用*或 - &gt;,共享指针就可以使用前向声明的类型在他们身上所以它应该只是简单地写: -
class IStarter;
typedef boost::shared_ptr<IStarter> IStarterPtr;
您需要包含<boost/shared_ptr.hpp>
当然
答案 1 :(得分:2)
虽然它会添加一个头文件,但你可以把它放在一个单独的头文件中:
#include <boost/shared_ptr.hpp>
class IStarter;
typedef boost::shared_ptr<IStarter> IStarterPtr;
然后将它包含在IStarter.h和其他标题中,避免代码重复(尽管在这种情况下它很小)。
但可能有更好的解决方案。
答案 2 :(得分:2)
你不能在C ++ 98中转发声明typedef,所以在这种情况下我通常做的是拉出typedef,我需要将它们放入types.h
文件或类似的东西。这样,公共类型代码仍然与类本身的定义分开。
答案 3 :(得分:1)
有一种方法,但您需要在文件中包含boost标头:
#include <boost/shared_ptr.hpp>
class IStarter;
typedef boost::shared_ptr<IStarter> IStarterPtr;
// ...
virtual void addStarter(IStarterPtr starter)
{
_starter = starter;
}
// ...
IStarterPtr _starter;