2

私は最近、 の使い方を学ぼうとしましたstd::shared_ptr。既存のコードを変更するとき、(初期化リストの外で) メンバー変数を割り当てるときに混乱していることに気付きました。

私の古いコード:

Class A {

Base* member_var;

A() {
    this->member_var = new Derived();
}

};

私の新しいコード:

Class A {

std::shared_ptr<Base> member_var;

A() {
    //Note the shared_ptr is given type Derived, matching the object.
    this->member_var = std::shared_ptr<Derived> (new Derived());
}

};

これは正しいです?それとも、これはおそらくより正しいですか?:

Class A {

std::shared_ptr<Base> member_var;

A() {
    //Note the shared_ptr is of type Base, matching the member type.
    this->member_var = std::shared_ptr<Base> (new Derived());
}

};

これら2つのステートメントの違いは何ですか。

心配なことに、ここでやろうとしていることのコード例が見つからないようです。使用する私のアプローチはstd::shared_ptr間違っていますか?


編集:助けてくれてありがとう。混乱を招いたと思います。将来の読みやすさのために、なぜこのアプローチを取ることにしたのかを詳しく説明します。簡単なコード例で質問を説明することにしました。私の実際の問題では、 を使用せず、Class A実際には構造体を使用しています。この構造体の唯一の目的は、さまざまなオブジェクトの多数のインスタンスをきちんと保持できるようにすることです。関数への引数として、構造体自体ではなく、各オブジェクトを (参照によって) 個別に渡すことがよくあります。さらに、構造体全体を引数として渡す場合、この構造体を値渡しする傾向があります。したがって、unique_ptr ではなく、これらの shared_ptr を作成することに関心があります。私はすべてを変更し、これらすべてをクラスにカプセル化することについて議論してきました。Class A私の例では、オブジェクトインスタンスを参照渡しするクラスのインスタンスを渡します。この場合、私はコメントしたすべての人に同意し、unique_ptrより適切だと思われます.

もちろん、構造体とクラスの間に根本的な違いはありません。私は、構造体のインスタンスを値で渡し (含まれているのがポインターだけの場合)、クラスのインスタンスを参照で渡す傾向があります。もしかして、これは私の個人的な癖でしょうか?

そもそもポリモーフィズムの使用に関しては、ここには 2 つの派生クラスがあり、そのうちの 1 つが実行時に選択されます。すべての意図と目的のための抽象クラスである基本クラスを処理したいと考えています。

これがより一般的な状況ではないことに、私はまだ驚いています。おそらく、上記の段落は、さらなる悪い慣行を浮き彫りにしました。その場合は、それについて聞いていただければ幸いです。

4

1 に答える 1