Joh*_*n H 2 c++ reference copy-constructor
我有以下课程:
class Player
{
public:
Inventory& GetInventory()
{
return inventory;
}
private:
Inventory inventory;
};
class Inventory
{
// Methods removed for brevity
private:
std::vector<std::string> items;
};
Run Code Online (Sandbox Code Playgroud)
我想要做的是允许代码的用户修改内容Player::inventory而不能将其重新分配给不同的对象.简短的例子:
Player player;
// OK: I want to able to add items.
player.GetInventory().AddItem("Item 1");
// Not OK: I don't want to be able to assign
// Player::inventory to a different Inventory.
Inventory badInventory;
player.GetInventory() = badInventory;
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过修改GetInventory()返回来实现这一目标Inventory* const,但是这种情况让我怀疑我认为引用的真实性.我相信他们:
这对我说,badInventory必须以某种方式被隐含地复制.所以我定义了一个复制构造函数,希望能够记录调用,如下所示:
Inventory(const Inventory& rhs)
{
std::cout << "Copy ctor." << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但这永远不会激发.所以我的问题归结为:这条线上发生了什么?
player.GetInventory() = badInventory;
Run Code Online (Sandbox Code Playgroud)
我在这里遗漏了一些东西,但我不知道它是什么.
小智 6
该行实际上是调用复制赋值运算符,而不是复制构造函数.这是声明为的函数
Inventory& operator=(const Inventory&);
Run Code Online (Sandbox Code Playgroud)
请注意,这player.GetInventory()是一个已经存在的对象,因此它无法调用复制构造函数,因为您没有构造任何东西.
如果要禁止复制库存,请删除以下功能:
Inventory(const Inventory&) = delete;
Inventory& operator=(const Inventory&) = delete;
Run Code Online (Sandbox Code Playgroud)
或者,如果您的编译器缺少C++ 11支持,请将它们声明为private并且不提供定义.
private:
Inventory(const Inventory&);
Inventory& operator=(const Inventory&);
Run Code Online (Sandbox Code Playgroud)