クラスタイプのオブジェクトを初期化しないようにし、ポインターを使用せずにこれが当てはまる場合を識別するにはどうすればよいですか?

アポロジョンソン

私は最近、過去数年間C ++を使用していることを知りました。私はポインターを頻繁に使用しており、通常はポインターをより適切なものに簡単に置き換えることができます。私がそれらを使用したのは、オブジェクトを初期化解除できるようにするためのもので、簡単にチェックできました。

たとえば、ゲーム内のオブジェクトにアタッチしたいカメラがあるとします。

Class Camera {
    public:
        Entity *attachEntity;
        Camera() {
            attachEntity = nullptr;
        }

        void update() {
            // If there's an entity to be attached to
            if (attachEntity != nullptr) {
                ...
            }
        }
};

これはポインタの悪い使い方ですか?私はこれを使わずにこれを行う良い方法を見つけることができません。また、エンティティにアタッチする必要がないnullptr場合は、ポインタであれば再度設定できます。それ以外の場合attachEntityは、現時点でカメラが接続されているかどうかに関係なく、常にが存在する必要がありますこの慣行に何か問題はありますか?ポインタなしでこれを行う良い方法はありますか?NULLポインタのようにオブジェクトを設定することはできないのを見ましたこれを行うための最良の方法は何ですか?

Michael Chourdakis

はい。std :: shared_ptr使用します。これは、不要になったときに自動破棄します。そして、クラス内のコピー/移動コンストラクターに関するすべてを忘れてしまいます。また、nullptr自動的に初期化されます。その場合、コンストラクターは必要ありません。

タイプのオブジェクトが1つしかない場合など、ポインタが重複しないことが確実な場合は、std :: unique_ptrを使用することもできますCamera通常、私はshared_ptrを使用して、スレッドなどを介したコピーを許可します。

Class Camera {
    public:
        shared_ptr<Entity> attachEntity;

        void update() {
            // If there's an entity to be attached to
            if (attachEntity) {
                ...
            }
        }
};

一般に、rawポインターは、WinAPIなどのポインターのみの関数を呼び出すのに最近だけ役立ちます。そうすれば、そうでないオブジェクトを移動/複製したい場合を除いて、クラスにコピー/移動コンストラクターや代入演算子またはデストラクタは必要ありません。 WindowsのHANDLEのように、言語に表示されます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ