C ++ 11のクラスメンバーとしてのスマートポインターの使用法を理解できません。私はスマートポインターについて多くを読みましたが、私はどのようにunique_ptr
、およびshared_ptr
/またはweak_ptr
一般的に機能するかを理解していると思います。わからないのは本当の使い方です。誰もunique_ptr
がほとんどいつも行く方法として使うことを勧めているようです。しかし、私はこのようなものをどのように実装しますか:
class Device {
};
class Settings {
Device *device;
public:
Settings(Device *device) {
this->device = device;
}
Device *getDevice() {
return device;
}
};
int main() {
Device *device = new Device();
Settings settings(device);
// ...
Device *myDevice = settings.getDevice();
// do something with myDevice...
}
ポインタをスマートポインタに置き換えたいとしましょう。のunique_ptr
ためにA は機能しないでしょうgetDevice()
?だから、私が使用した時間だshared_ptr
とweak_ptr
?使用方法はありませんunique_ptr
か?shared_ptr
本当に小さなスコープでポインターを使用していない限り、ほとんどの場合、私には思えるのですが?
class Device {
};
class Settings {
std::shared_ptr<Device> device;
public:
Settings(std::shared_ptr<Device> device) {
this->device = device;
}
std::weak_ptr<Device> getDevice() {
return device;
}
};
int main() {
std::shared_ptr<Device> device(new Device());
Settings settings(device);
// ...
std::weak_ptr<Device> myDevice = settings.getDevice();
// do something with myDevice...
}
それは行く方法ですか?どうもありがとう!
shared_ptr
8/10の場合はa が正しいです。他の2/10はとの間unique_ptr
で分割されweak_ptr
ます。また、weak_ptr
通常は循環参照を解除するために使用されます。あなたの使用法が正しいと考えられるかどうかはわかりません。
device
データメンバーにどのような所有権を求めますか?最初にそれを決定する必要があります。
unique_ptr
代わりにa を使用して、コンストラクターを呼び出すときに所有権を放棄できることを理解しています。しかし、Settings
クラスの設計者として、呼び出し元も参照を保持したいかどうかはわかりません。多分デバイスは多くの場所で使用されます。OK、多分それはまさにあなたのポイントです。その場合、私は唯一の所有者ではないので、そのときにshared_ptrを使用すると思います。そして:スマートポイントはポインターを置き換えますが、参照を置き換えませんか?
device
、のコンストラクタに渡された後もsettings
、それを呼び出しスコープで参照できるようにしsettings
ますか、それとも経由してのみ参照できますか?後者の場合、unique_ptr
便利です。また、あなたはの戻り値がシナリオなければならないのgetDevice()
ですがnull
。そうでない場合は、参照を返します。