【问题标题】:Getter and setter for unique_ptr object (dependency injection)unique_ptr 对象的 getter 和 setter(依赖注入)
【发布时间】:2013-04-15 08:49:16
【问题描述】:

我有一个 MyClass 类,它拥有某个 DataProvider 类的一个实例,并且为此有一个 getter。

为了依赖注入,我希望有一个 getter 和一个 setter。此外,DataProvider 应包含在 std::unique_pointer 中:

#include <memory>
#include <iostream>

class DataProvider
{
public:
    DataProvider() {}
    virtual ~DataProvider() {}
    /* stuff */

private:
    /* more stuff */

};

class MyClass
{
public:
MyClass() {}

    virtual inline const DataProvider &getDataProvider() const
    {
        return *data;
    }
    void setDataProvider(std::unique_ptr<DataProvider> newData)
    {
        data = std::move(newData);
    }

private:
    std::unique_ptr<DataProvider> data;
};

我读过这个:How do I pass a unique_ptr argument to a constructor or a function?

但它不包括吸气剂部分。这是(以上)正确的方法吗?可以考虑哪些替代方案?

【问题讨论】:

  • 完整的例子会比代码 sn-ps 更好
  • Works fine here。什么虚表?我们没有任何虚函数。
  • @sftrabbit 你说得对,我必须添加一些关于 DataProvider 的更多信息以及它最终被破坏的方式。
  • DataProvider的默认构造函数是否设置xyz
  • @user1916893 好的,提取您认为重要的行并使用它们制作一个新的小程序。当您遇到同样的问题时,请在此处发布。据我们所知,问题在于 1500 行遗留代码。

标签: c++ visual-studio-2012 dependency-injection getter-setter unique-ptr


【解决方案1】:

正如你所写的

virtual inline const DataProvider &getDataProvider() const
{
    return *data;
}
void setDataProvider(std::unique_ptr<DataProvider> newData)
{
    data = std::move(newData);
}

完全没问题。在 setter 中,该类获得 DataProvider 实例的所有权并且永不放手(就这里所见而言)。

sftrabbit 在这里给出了一个完整的例子:http://ideone.com/enarAS

【讨论】:

  • 你能为新手解释一下virtual inline const DataProvider &amp;getDataProvider() constvirtualinline 和两个const 的使用)的整个事情吗? :)
  • @toggy getDataProvider 是方法的名称,我猜这很简单。 const 通常意味着“这里有一些不变的东西,一个具有无法更改的值的变量”(它可以被绕过,但在此评论中我假设 const 表示“不可更改”)。第二个const 仅表示在此方法中不会更改任何类成员。 this 指针本身是 const。第一个 const 是返回类型 const DataProvider&amp; 的一部分 - 对 DataProvider 对象的引用,并且此对象无法更改。
  • @toggy 一个声明为virtual的方法最好用一个例子来解释:假设你有一个基类A和一个派生自A的类B。A有一个公共方法f()。因此,您可以对 A 类型的对象和 B 类型的对象调用 f()。现在 B 也有一个方法 f()。考虑一个指向 A 类型对象的指针 c:A* c;。如果 c 实际指向 B 类型的对象并且您编写了 'c->f();',则 A 的 f() 将被调用 除非 f() 是虚拟的,在这种情况下 f B 的 () 将被调用。这就是区别。
  • @toggy 'inline' 意味着在构建项目时,优化器应该*喜欢*(!) 在调用方法的每个位置替换方法主体。事实上,我通常不使用这个关键字,让编译器自己决定。无论如何,我在这里找到了一个很好的解释:en.cppreference.com/w/cpp/language/inline
  • @KillKRT *data 被强制转换为对 member 的引用,而不是临时的。所以,是的,它是安全的。
【解决方案2】:

虽然我不确定这是否真的是您需要的,但这是一个起点:

const DataProvider &getDataProvider() const
{
    return *data.get();
}

【讨论】:

  • 据我了解 unique_ptr 恕我直言,这没什么区别。
猜你喜欢
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多