0

私は を持っていて 、それから; class Aのベクトルを作りました。、そして私はそれを正しく初期化します。class Astd::vector<A> b

Aのベクトルを指すメンバーポインターを持つ別のクラスのメンバー関数が1つあります。

このクラスには、メンバー関数もあり、このメンバー関数内にあります。クラスAのベクトルへの参照を作成し、ポインタの参照を使用して初期化します。理由は、メンバー参照は値を1回しか割り当てることができないため、ポインターを使用しますが、メンバー関数内では、参照の構文は次のとおりです。もっときれいな。

問題は、メンバー関数で、そのベクトルへの参照を削除した場合、参照のみを削除するか、ポインターが指すコンテナー全体を削除するかです。コンテナーには、ポインターではなくオブジェクトが含まれています。

ありがとう

4

2 に答える 2

1

参照が範囲外になると、元のオブジェクトは破棄されません。

私はこれが状況であると仮定します:

class A {};

class B
{
     std::vector<A>* pA;

public:
     B( std::vector<A>* p ): pA(p) {}

     void foo()
     {
          std::vector<A>& arr = *pA;
          //do stuff with arr
          // Arr and pA are still valid after the end of this function
     }
};

int main()
{
    std::vector<A> Arr;
    Arr.push_back( A() );

    B b( &Arr );
    b.foo();
}
于 2012-11-13T17:21:12.133 に答える
0

例を提供する必要がありますが、あなたが提供したものでは、それはすでに大したことではありません!

a を保存するstd::vector<A>と、タイプ A の実際のオブジェクトが保存されます。ベクトルが大きくなると、項目が新しいメモリ位置にコピーされるため、オブジェクトのベクトル内に項目へのポインターまたは参照を保持しても、期待どおりに機能しません。

代わりにポインタを格納することを検討してください ( std::vector<A*>)

a へのポインターを削除すると、std::vector<A>すべてが削除されます。に切り替える場合std::vector<A*>は、ベクター内のすべてのオブジェクトを削除してから、ベクターを削除する必要があります。

于 2012-11-13T17:21:30.067 に答える