私は最近、過去数年間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
ポインタのようにオブジェクトを設定することはできないのを見ました。これを行うための最良の方法は何ですか?
はい。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]
コメントを追加