【发布时间】:2013-01-27 23:47:00
【问题描述】:
我有一个带有 Glib::ustring 成员的类(如果你不熟悉它,假设它是 std::string),它应该包含一个长字符串,即至少一个段落,可能还有更多.甚至可能超过 10 段。该字符串计划在 GUI 中显示,因此将来可能会将其存储在文本小部件的缓冲区中,但现在它只是我的 C++ 类的字符串成员对象。
问题是:如何将字符串传递给构造函数,以及如何将其传递给set_string() setter方法。长字符串意味着大副本,所以我认为一个好的解决方案是采用右值引用并将 std::move 参数放入成员对象中。但我也不希望类接口令人惊讶且难以使用/理解。你知道,最不意外的规则。
所以我在想,在这种情况下,预期/常见的解决方案是什么?
(对于setter方法,这里还有一个选择:因为编辑是在GUI中完成的,所以让GUI直接编辑字符串,然后setter方法的唯一用途就是以编程方式完全替换字符串,例如重置或撤消最近的编辑)
class MyClass
{
public:
explicit MyClass (Glib::ustring str);
void set_string (Glib::ustring str);
private:
Glib::ustring str;
}
(我已经看到现有库的代码,例如 gtkmm,通过 const 引用获取字符串,但我也看到 SO 帖子的答案是按值传递以允许优化)
【问题讨论】:
-
通过引用传递字符串。
-
@Aeluned 不好的建议:如果要复制它,请传递 value。然后
move出复制的参数。让编译器在调用视线处进行复制,而不是将其隐藏在方法的主体中,这样就可以使用 copy-in-body 版本所缺少的优化。
标签: c++ c++11 parameter-passing glib stdstring