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