私は Glib::ustring メンバーを持つクラスを持っています (あなたがそれに慣れていない場合は、それが std::string であると想定してください)。これには長い文字列、つまり少なくとも 1 つの段落、おそらくさらにいくつかの段落が含まれることが期待されます。たぶん10段落以上。文字列は GUI に表示される予定なので、将来的にはテキスト ウィジェットのバッファに格納される可能性がありますが、今のところは、私の C++ クラスの単なる文字列メンバー オブジェクトです。
問題は、文字列をコンストラクターに渡す方法と、それを set_string() セッター メソッドに渡す方法です。長い文字列は大きなコピーを意味するため、適切な解決策は右辺値参照を取得し、引数をメンバー オブジェクトに 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 の投稿も見ました)