C++ 11 - 将引用作为所有权的构造函数参数传递

C++ 11 - Pass a reference as a constructor argument for ownership

我是 C++ 新手,所以我可能没有使用正确的术语。这就是我想要做的。

我有 类 FooBar。 我想创建一个 Foo 的实例。 然后我想创建 Bar 的实例并将 Foo 实例传递给 Bar 的构造函数,这样 Bar 现在拥有 Foo 的生命周期.这样当 Bar's 析构函数被调用时,它 will/should 取消分配 Foo 实例。

此外,我想让 FooBar 的用户明白(使用正确的 C++ 语义)Bar 拥有 Foo 实例。

我也乐于接受任何 advise/best 练习建议。

这是我的尝试。我觉得不对劲的是 Bar 的析构函数中的 delete &m_foo; 。我也不明白 :m_foo(foo) 在 Bar 的 ctor 中到底在做什么(它到底叫什么 - 我怎么说呢?)。我原以为在构造函数中进行赋值是正确的。

class Foo
{
public:
    Foo();
    ~Foo();
private:

};

Foo::Foo()
{
}

Foo::~Foo()
{
}

class Bar
{
public:
    Bar(Foo & foo);
    ~Bar();
private:
    Foo & m_foo;

};

Bar::Bar(Foo & foo)
    :m_foo(foo)
{
}

Bar::~Bar()
{
    delete &m_foo;
}

这是我想如何使用它

int main()
{
    auto foo = new Foo();
    auto bar = new Bar(*foo);
    delete bar;
    return 0;
}

正确的方法是 std::unique_ptr:

#include <memory>


class Foo
{
public:
    Foo() {}
    ~Foo() {}
private:

};

class Bar
{
public:
    Bar(std::unique_ptr<Foo> foo);
    ~Bar()
    {
       // m_foo will be destroyed at the end, and the Foo object
       // that m_foo points to will be destroyed as well.
    }
private:
    std::unique_ptr<Foo> m_foo;

};

Bar::Bar(std::unique_ptr<Foo> foo)
    // This section after the colon and before the open brace
    // is the member initializer list. This defines what
    // arguments are passed to the constructors of the members.
    : m_foo(std::move(foo))
        // std::move is required here to make it clear that
        // you are transferring ownership to the member.  It
        // causes the move constructor to be used instead of
        // the copy constructor.
{
}

int main()
{
    Bar bar(std::unique_ptr<Foo>(new Foo));
    return 0;
}

您必须将成员作为指针而不是引用来访问。

对于 C++14,你会想使用 std::make_unique 来构造你的 Foo 指针,但由于这是一个 C++11 问题,我使用了 new.