【发布时间】:2021-07-09 07:29:45
【问题描述】:
有没有办法可以移动在 main 中创建的对象 GuitarSpec 而不是复制它?
所以这里是下面的例子:- 有一个包含吉他列表的 Inventory 类,要添加吉他,有一个名为 addGuitar 的函数,它接受字符串、双精度和 GuitarSpec 对象作为参数。
库存
class Inventory {
private:
list<Guitar> inventory;
public:
void addGuitar(const string &, double, const GuitarSpec &spec);
添加吉他功能
void Inventory::addGuitar(const string &serialNumber, double price,
const GuitarSpec &spec) {
inventory.emplace_back(serialNumber, price, spec);
}
吉他构造器
Guitar::Guitar(const string& serialNumber, double price, const GuitarSpec &spec)
: serialNumber{serialNumber}, price{price}, spec(spec) {
cout << "Guitar Constructor" << endl;
}
主要功能:-
Inventory inventory;
inventory.addGuitar(
"1001", 200,
GuitarSpec(toString(FEDER), "starocaster", toString(ELECTRIC),
toString(Wood::SIKTA), toString(Wood::SIKTA)));
有没有办法移动那个 GuitarSpec 对象而不是复制它,或者任何其他更好的解决方案?
【问题讨论】:
-
除非您有非常具体的需求和要求,否则默认容器类型应为
std::vector。你选择std::list的原因是什么(我猜是)? -
GuitarSpec可以移动吗?您是否尝试过实施动作?你遇到了什么问题?请出示minimal reproducible example -
@Someprogrammerdude 我实际上正在阅读 Head First OOA 和 Design,示例使用列表而不是矢量,所以我选择了它。
-
@Mohammad Hussein Spec 参数必须是可变的或通过
GuitarSpec&&右值引用传递,而不是通过 const 引用传递,那么只要规范设计正确,std::move就足够了。见stackoverflow.com/questions/28595117/…你也可以将Guitar构造函数作为模板并使用完美转发。
标签: c++ oop constructor copy-constructor move-constructor