假设我有以下抽象类并将其用作C ++中的“接口”:
class IDemo
{
public:
virtual ~IDemo() {}
virtual void Start() = 0;
};
class MyDemo : IDemo
{
public:
virtual void start()
{
//do stuff
}
};
然后在需要有接口句柄的类中(通过注入具体类):
class Project
{
public:
Project(IDemo demo);
private:
IDemo *_demo;
};
我的目的是通过Project的构造函数分配具体的Demo类。此代码无法编译,因为IDemo无法实例化。有什么建议? 提前谢谢。
答案 0 :(得分:5)
尝试:
Project::Project(IDemo* demo)
: _demo(demo)
{}
但如果演示对象在项目的生命周期内永远不会改变,那么我更愿意通过引用传递:
class Project
{
public:
Project(IDemo& d)
: demo(d)
{}
private:
IDemo& demo;
};
然后像这样使用它:
int main()
{
MyDemo demo;
Project project(demo);
}
答案 1 :(得分:3)
Project(IDemo demo);
应该是
Project(IDemo *demo);
答案 2 :(得分:2)
必须:
class IDemo
{
public:
virtual ~IDemo() {}
virtual void Start() = 0;
};
class MyDemo : public IDemo
{
public:
virtual void Start()
{
//do stuff
}
};
...............................
class Project
{
public:
Project(IDemo* demo);
private:
IDemo *_demo;
};
请注意
(1)class MyDemo : public IDemo
(2)IDemo* demo
之前已经提出过建议(或者您也可以使用IDemo& demo
,但使用指针指向接口是常规的。)
(3)virtual void Start() {...}
代替start
(标识符区分大小写)。
答案 3 :(得分:1)
如果没有看到确切的编译器警告,我建议您更改
Project(IDemo demo);
到
Project(IDemo *demo);
答案 4 :(得分:1)
这取决于。如果具体Demo
对象不归Project
所有,请使用引用:
class Project
{
public:
Project(IDemo &demo);
private:
IDemo &_demo;
};
如果您想要所有权,请使用boost::shared_ptr
:
class Project
{
public:
Project(boost::shared_ptr<IDemo> demo);
private:
boost::shared_ptr<IDemo> _demo;
};
Project project(boost::make_shared<Demo>());
在C ++ 0x中,如果您不想共享所有权,也可以使用std::unique_ptr
。