現在生のポインターを使用しているコードがいくつかあり、スマートポインターに変更したいと思います。これは、さまざまな方法でコードをクリーンアップするのに役立ちます。とにかく、オブジェクトを返すファクトリメソッドと、オブジェクトを管理する呼び出し元の責任があります。所有権は共有されていないので、私unique_ptr
は適切だと思います。私が返すオブジェクトは通常、すべて単一の基本クラスから派生しObject
ます。
例えば、
class Object { ... };
class Number : public Object { ... };
class String : public Object { ... };
std::unique_ptr<Number> State::NewNumber(double value)
{
return std::unique_ptr<Number>(new Number(this, value));
}
std::unique_ptr<String> State::NewString(const char* value)
{
return std::unique_ptr<String>(new String(this, value));
}
Object
返されるオブジェクトは、タイプのオブジェクト(基本クラス)を操作する別の関数に渡す必要があることがよくあります。スマートポインタがない場合、コードは次のようになります。
void Push(const Object* object) { ... } // push simply pushes the value contained by object onto a stack, which makes a copy of the value
Number* number = NewNumber(5);
Push(number);
このコードを使用するようunique_ptrs
に変換すると、ポリモーフィズムの問題が発生しました。当初は定義を変更しPush
て使用するunique_ptrs
ことにしましたが、派生型を使用しようとするとコンパイルエラーが発生します。次のように、オブジェクトを基本タイプとして割り当てることができます。
std::unique_ptr<Object> number = NewNumber(5);
そしてそれらをに渡しPush
ます-もちろん機能します。ただし、派生型のメソッドを呼び出す必要があることがよくあります。結局、私はPush
によって保存されたオブジェクトへのポインタを操作することにしましたunique_ptr
。
void Push(const Object* object) { ... }
std::unique_ptr<Object> number = NewNumber(5);
Push(number.get());
さて、投稿の理由に。これが私が抱えていた問題を解決する通常の方法であるかどうかを知りたいですか?対オブジェクト自体をPush
操作する方が良いですか?unique_ptr
もしそうなら、どのようにしてポリモーフィズムの問題を解決しますか?単純にptrsをキャストするだけではうまくいかないと思います。スマートポインターから基になるポインターを取得する必要があるのは一般的ですか?
質問が明確でない場合は申し訳ありません(私に知らせてください)。
編集:私のプッシュ機能は少し曖昧だったと思います。基になる値のコピーを作成し、入力オブジェクトを実際に変更したり、保存したりすることはありません。