当前位置:  开发笔记 > 编程语言 > 正文

C++中的依赖注入

如何解决《C++中的依赖注入》经验,为你挑选了3个好方法。

这也是我在MiškoHevery 关于依赖注入处理谷歌会谈的评论中提出的一个问题,但它已被埋没在评论中.

我想知道将依赖关系连接在一起的工厂/构建器步骤如何才能在C++中工作.

即我们有一个依赖于B的A类.构建器将在堆中分配B,在A的构造函数中传递指向B的指针,同时在堆中分配并返回指向A的指针.

谁事后清理?建造者在完成后清理它是否好?它似乎是正确的方法,因为在谈话中它说构建器应该设置预期具有相同生命周期的对象,或者至少依赖关系具有更长的生命周期(我也有一个问题).我在代码中的意思是:

class builder {
public:
    builder() :
        m_ClassA(NULL),m_ClassB(NULL) {
    }
    ~builder() {
        if (m_ClassB) {
            delete m_ClassB;
        }
        if (m_ClassA) {
            delete m_ClassA;
        }
    }
    ClassA *build() {
        m_ClassB = new class B;
        m_ClassA = new class A(m_ClassB);
        return m_ClassA;
    }
};

现在,如果有一个依赖项预计持续时间超过我们注入的对象的生命周期(比如ClassC就是依赖项)我明白我们应该将构建方法改为:

ClassA *builder::build(ClassC *classC) {
    m_ClassB = new class B;
    m_ClassA = new class A(m_ClassB, classC);
    return m_ClassA;
}

你最喜欢的方法是什么?



1> Martin York..:

这个讲座是关于Java和依赖注入的.

在C++中,我们尽量传递RAW指针.这是因为RAW指针没有与之关联的所有权语义.如果您没有所有权,那么我们不知道谁负责清理对象.

我发现大部分时间依赖注入是通过C++中的引用完成的.
在极少数情况下,必须使用指针,将它们包装在std :: unique_ptr <>或std :: shared_ptr <>中,具体取决于您希望如何管理所有权.
如果您不能使用C++ 11功能,请使用std :: auto_ptr <>或boost :: shared_ptr <>.

我还要指出,C++和Java编程风格现在如此不同,以至于将一种语言的风格应用于另一种语言将不可避免地导致灾难.



2> Igor Zevaka..:

这很有意思,DI在C++中使用模板:

http://adam.younglogic.com/?p=146

我认为作者正在做出正确的举动,以至于没有将Java DI翻译成C++.值得一读.



3> cheez..:

我最近被DI虫咬了.我认为它解决了很多复杂性问题,特别是自动化部分.我写了一个原型,让你以漂亮的C++方式使用DI,或者至少我是这么认为的.您可以在这里查看代码示例:http://codepad.org/GpOujZ79

显然缺少的东西:没有范围,没有绑定到实现的接口.后者很容易解决,前者,我不知道.

如果有人对代码有任何意见,我将不胜感激.

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有