0

私が持っているタスクの一部は、他の 2 つのクラスの 2 つのリストを含むクラスを作成し、「ビッグ 4」(コンストラクター、コピー コンストラクター、operator=、デストラクター) を作成することです。

これが私がしたことです:

using namespace std;

class A{...};
class B{...};

class C{
  list<A> a;
  list<B> b;
  public:
    C();
    ~C();
    C(const C& c);
    void operator=(const C& c);
};

C::C(){
  //How to allocate memory for a and b?
}

C::~C(){
  //How to free the memory?
}

C::C(const C& c){
  a=c.a;
  b=c.b;
}

void operator=(const C& c){
  if(&c==this) return;
  // how do I delete a and b?
  a=c.a;
  b=c.b;
}

私が理解していないこと(コード内のコメントとして)をクリアしていただけますか。また、何も正しく行っていない場合はアドバイスをいただけますか?

4

5 に答える 5

2

値 ( std::listvalues) を使用しているため、何もする必要はありません。コンストラクターはコンストラクターを自動的に呼び出し、std::list必要なリソースを割り当てます。std::listデストラクタは、取得したリソースを解放するデストラクタを呼び出します。

リストへのポインター (つまり ) またはポインターのリスト ( ) またはその両方 ( )を保持する場合は、追加の作業必要になります。std::list<A> *a;std::list<A*> a;'std::list<A*> *a;

于 2012-08-31T14:11:51.793 に答える
0

move-constructor の登場により、今では Big Six になっています。ここですべての詳細を学習して理解すれば、ボイラー プレート クラスの修士号を取得できます。

#include <list>

class A {};
class B {};

class C{
  std::list<A> a;
  std::list<B> b;
  public:
    typedef std::list<A>::size_type size_type;
    explicit C(size_type sz =0);
    virtual ~C();
    C(const C& c);

    // Specialize external swap. Necessary for assignment operator below,
    // and for ADL (argument-dependant lookup).
    friend void swap(C& first, C& second); 

    // Assignment-operator. Note that the argument "other" is passed by value.
    // This is the copy-and-swap idiom (best practice).
    C& operator=(C other);  // NOTE WELL. Passed by value

    // move-constructor - construct-and-swap idiom (best practice)
    C(C&& other);

};

C::C(size_type sz) : a(sz), b(sz) {}

C::~C(){}

C::C(const C& c) :a(c.a), b(c.b){}

void swap(C& first, C& second) {
        // enable ADL (best practice)
        using std::swap; 
        swap(first.a, second.a);
        swap(first.b, second.b);
}

// Assignment-operator. Note that the argument "other" is passed by value.
// This is the copy-and-swap idiom (best practice).
C& C::operator=(C other) {
    swap(*this, other); // Uses specialized swap above.
    return *this;
} 

// move-constructor - construct-and-swap idiom (best practice)
C::C(C&& other): a(0) , b(0) {
    swap(*this, other);
}
于 2012-08-31T16:56:12.877 に答える
0

変数は、明示的に削除する必要のない自動ストレージ クラスを使用しています。

代入演算子

void operator=(const& C rhs);

void を返すべきではありません。// これは組み込み型が行うことではなく、代入の連鎖を防ぐためです。

例えば

int x, y, z;
x = y = z = 0;

コメントで移動セマンティクスを実装しようとしているようです

// how do I delete a and b?

割り当て演算子は状態をコピーするか、非標準の動作を使用していることを文書化する必要があります。移動セマンティクス、boost::noncopyable など。

于 2012-08-31T14:27:05.047 に答える
0

//a と b にメモリを割り当てる方法は?

自分でメモリを割り当てる必要はありません。メンバー変数をスタックに割り当てているためです。これは、誰かがあなたのクラスをインスタンス化したときに自動的に設定されます。

//メモリを解放するには?

自分でメモリを解放する必要はありません。同じ理由で。スコープが終了すると、スタック変数は自動的に割り当て解除されます。

// a と b を削除するには?

なぜ a と b を削除する必要があるのですか? 他のオブジェクトからこれにデータをコピーしています。

于 2012-08-31T14:14:31.147 に答える
0

std::list を使用する場合、クラス A または B は、1 をスタックに割り当てることができ、2 をシングルトン オブジェクトにすることはできません。

于 2012-08-31T15:23:58.900 に答える