C++ で不変型 (クラス) を作成しようとしていますが、
すべてのメソッド「別名メンバー関数」がオブジェクトを変更せず、代わりに新しいインスタンスを返すようにしました。
私はたくさんの問題に出くわしていますが、それらはすべて C++ の参照型を中心に展開しています。
1 つの例は、参照によって同じクラス型のパラメーターを渡す場合です。
Imm Imm::someOp( const Imm& p_im ) const
{
...
p_im = p_im.someOtherOp(); //error, p_im is const, can't modify it!
...
}
エラーは、参照によって値を渡すことによって発生します。代わりに、参照を値渡ししていた場合、上記のエラー行はエラーにはなりません!
Java/C# の例を考えてみましょう
class Imm
{
...
Imm someOp( Imm p_im )
{
....
p_im = p_im.someOtherOp(); //ok, you're not modifying the
//original object, just changing the local reference
....
}
....
}
C ++でこのようなことを行うにはどうすればよいですか? ポインターを使用できることはわかっていますが、メモリ管理全体が混乱します。オブジェクトへの参照を誰が所有しているかについて心配したくありません。
理想的には、クラスを Python の不変文字列のように設計したいと考えています。それらが不変であることを気付かずに、または知らずに使用でき、期待どおりに動作します。彼らはただ働きます。
編集
もちろん、値渡しまたは一時変数を使用することで回避できます (これは私が現在行っていることです)。私が尋ねているのは、「C ++で参照を値で渡す方法」です
私は答えがSTLの何かを中心に展開することを期待しています.私は現在smart_ptrファミリーのテンプレートを調べています.
アップデート
返信ありがとうございます。ポインタから逃れることはできません。(私の他の質問を参照してください。これは実際にはこの質問のフォローアップです)