C++ 11 - 将引用作为所有权的构造函数参数传递
C++ 11 - Pass a reference as a constructor argument for ownership
我是 C++ 新手,所以我可能没有使用正确的术语。这就是我想要做的。
我有 类 Foo
和 Bar
。
我想创建一个 Foo
的实例。
然后我想创建 Bar
的实例并将 Foo
实例传递给 Bar
的构造函数,这样 Bar
现在拥有 Foo
的生命周期.这样当 Bar's
析构函数被调用时,它 will/should 取消分配 Foo
实例。
此外,我想让 Foo
和 Bar
的用户明白(使用正确的 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
.
我是 C++ 新手,所以我可能没有使用正确的术语。这就是我想要做的。
我有 类 Foo
和 Bar
。
我想创建一个 Foo
的实例。
然后我想创建 Bar
的实例并将 Foo
实例传递给 Bar
的构造函数,这样 Bar
现在拥有 Foo
的生命周期.这样当 Bar's
析构函数被调用时,它 will/should 取消分配 Foo
实例。
此外,我想让 Foo
和 Bar
的用户明白(使用正确的 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
.