[英]Using interface in C++ for dependency injection
假设我有以下抽象类,并将其用作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无法实例化。 有什么建议么? 提前致谢。
尝试:
Project::Project(IDemo* demo)
: _demo(demo)
{}
但是如果演示对象在项目的生命周期中永远不会改变,那么我更喜欢通过引用传递:
class Project
{
public:
Project(IDemo& d)
: demo(d)
{}
private:
IDemo& demo;
};
然后像这样使用它:
int main()
{
MyDemo demo;
Project project(demo);
}
Project(IDemo demo);
应该
Project(IDemo *demo);
一定是:
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
(或者你也可以使用IDemo& demo
但是使用指针到接口是常规的)。
(3) virtual void Start() {...}
而不是start
(标识符区分大小写)。
没有看到确切的编译器警告我建议你改变
Project(IDemo demo);
至
Project(IDemo *demo);
这取决于。 如果具体的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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.