0

std::unique_ptrコンストラクターによって初期化され、クラスの他の場所で使用されるクラスをクラスに含めたいと思います。

だから私はstd::unique_ptrこのようなものを含むクラスを持っています:

class ObjectA
{
public:
    ObjectA();
    ~ObjectA();
    void SomeFunction();

private:
    std::unique_ptr<ObjectB> myPointer;
}

次に、クラスのソース ファイルmyPointerで、コンストラクターでセットアップされ、で使用されSomeFunction()ます。

ObjectA::ObjectA()
{
    ObjectC objectC;
    myPointer = std::move(std::unique_ptr<ObjectB>(objectC.getPointer())); //setup pointer
}

ObjectA::~ObjectA() {}

void ObjectA::SomeFunction()
{
    //use myPointer here
}

myPointerただし、問題は、 で使用できないことです。そのSomeFunction()理由は次のとおりです。

myPointerコンストラクターの実行が完了したときにヒープが破棄されないように、明らかにヒープに割り当てる必要があります。ObjectCその結果、その関数は外部ライブラリからのものであると仮定します。戻り値のポインターを呼び出すとObjectC::getPointer()、おそらくヒープに並置されたスタックに割り当てられます。コンストラクターの実行が終了した直後にエラーが発生するため、これが当てはまると思います。

基本的に、私は関数に依存してポインターを提供し、それを使用して他の場所で使用できます。ただし、関数はオブジェクトをヒープではなくスタックに割り当てます。

おそらく二重ポインタを使用して、この問題を解決する特別な方法はありますか? ObjectC::getPointer()または、各実行ブロック内でポインターを使用するたびに呼び出す必要がありますか? ObjectA内部に依存する関数がたくさんある場合、関数ごとmyPointerに呼び出すObjectC::getPointer()のは冗長になりますが、これを修正するより良い方法があるかどうかはわかりませんObjectC::getPointer()。 .

4

1 に答える 1

1

を呼び出すとObjectC::getPointer()、「a」ポインターを取得するだけではありません。関数は、ポインターに対して有効な操作、特にポインターを破棄する方法を指定する必要があります。

通常、それは ですがdelete、例えば の場合もありますfclose。ドキュメントを読む必要があります。返されたポインタの寿命が の寿命と一致する場合、 の寿命も一致するobjectCはずobjectCですmyPointer。したがって、おそらくメンバーである必要があり、それはつまり、myPointer冗長になる可能性があることを意味します。あなたはちょうど代用することができますprivate: ObjectB& getB() { return *myObjectC.GetPointer(); }

于 2013-06-21T11:17:56.080 に答える