2

DevicePointerをカプセル化するクラス がありstd::shared_ptr<Device>ます。Device へのポインターを保持する必要があるさまざまなクラスは、から派生しDevicePointerます。を使い始める前にshared_ptr、生のポインターをデバイスに返す関数がありましたDevicePointer::Expose()現在、デバイス ポインターを保持するために shared_ptr を使用していますが、それを返す方法がわかりません。呼び出す必要がある唯一の理由::Exposeは、ポインターを逆参照することであることに注意してください。

元の Expose は次のようになります。

Device * Expose() const  { return MyDevice; }

次のように使用されます。

Device::Expose()->ExecuteFunction(a, b, c);

MyDevicestd::shared_ptr<Device>です。逆参照のためにそれを返す方法がわかりません。明らかな選択は次のとおりです。

std::shared_ptr<Device> Expose() {
    return MyDevice;
}

しかし、パフォーマンス、特に新しい一時的な作成が心配std::shared_ptrです。したがって、「このポインターを逆参照することはできますが、コピーすることはできません」と言う方法が必要です。多くのオブジェクトがオリジナルへの参照を保持するため、オリジナルは共有する必要があります。

私の質問を適切に表現できたことを願っています。ありがとう。

4

3 に答える 3

2

これでパフォーマンスが損なわれることはありません

Device & Expose() {
    return *MyDevice.get();
}

編集:

オブジェクトをコピー不可にするには:

class Device
{

private:
    //compiler will throw errors when copy constructor or = is called in the code
    Device(const Device &)
    {}
    void operator = (const Device &)
    {
    }
};

編集 (2018-09-05):

c++11 以降では、コピー コンストラクターまたは代入演算子を明示的に削除できます。

class Device
{
public:
    Device(const Device &) = delete;
    Device& operator = (const Device &) = delete;
};
于 2013-11-05T17:16:32.050 に答える