unique_ptr对象的getter和setter(依赖注入)

Tob*_*obi 7 c++ dependency-injection unique-ptr getter-setter visual-studio-2012

我有一个类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;
};
Run Code Online (Sandbox Code Playgroud)

我读过这个:如何将unique_ptr参数传递给构造函数或函数?

但它不包括吸气剂部分.这(上面)是正确的方法吗?还有什么可以想到的?

Tob*_*obi 5

如你所写

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

完全可以。在设置器中,该类获得了DataProvider实例的所有权,并且永不松手(就此处所示)。

sftrabbit在此处给出了一个完整的示例:http ://ideone.com/enarAS

  • @toggy `getDataProvider` 是方法的名称,我猜这很简单。`const` 一般的意思是“这里有一些常量,一个变量的值不能改变”(它可以被绕过,但在这个评论中,我假设 `const` 的意思是“不可更改”)。第二个 `const` 只是意味着在这个方法中不会改变任何类成员。`this` 指针本身就是 `const`。第一个 `const` 是返回类型 `const DataProvider&amp;` 的一部分 - 对 DataProvider 对象的引用,该对象不能更改。 (2认同)
  • @toggy 声明为`virtual` 的方法最好用一个例子来解释:假设你有一个基类 A 和一个派生自 A 的类 B。A 有一个公共方法 f()。所以你可以对 A 类型的对象和 B 类型的对象调用 f()。现在 B 也有一个方法 f()。考虑一个指向 A 类型对象的指针 c:`A* c;`。如果 c 实际上指向 B 类型的对象并且您编写了“c-&gt;f();”,则 A 的 f() 将被称为 *除非 * f() 是虚拟的,在这种情况下 B 的 f() 将叫做。这就是区别。 (2认同)
  • @toggy 'inline' 意味着在构建你的项目时,优化器应该 *prefer*(!) 在调用方法的每个地方替换方法体。事实上,我通常不使用这个关键字,而是让编译器自己决定。无论如何,我在这里找到了一个很好的解释:http://en.cppreference.com/w/cpp/language/inline (2认同)