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_ptr8/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。そうでない場合は、参照を返します。