繁体   English   中英

在C ++中使用接口进行依赖注入

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM