0

ポインタのプロパティを理解しているかどうかを確認したいだけです。だから私がこのようなものを持っているなら:

#include <iostream>
using namespace std;

class Person
{
public:
  Person(){myBook = new Book(4);}
  void printPerson()
  {
    int i =0;
    while(i<n)
    {
        cout<<myBook[i].n<<endl;
        i++;
    }
  }

private:
   Book *myBook;
   int n;
};

class Book
{
public:
  Book(int num)
  {
      int n =0;
  }  
  int n;
  };

Personクラスのインスタンスはポインターであるため、コピーコンストラクターと代入operator =を作成しようとすると、新しいPersonオブジェクトに新しいBookを割り当てる必要があります。私は正しいですか?どうも

4

2 に答える 2

4

ここにバグがあります:

Person(){myBook = new Book(4);}

1つのBookオブジェクトをnum=4で割り当てます。4つのBook要素を割り当てる場合は、次のようにします。

Person(){myBook = new Book[4];}

それ以外の場合myBook[i]、whileループにアクセスすると、未定義の動作になります。

while(i<n)
{
   cout<<myBook[i].n<<endl;
               ^^^ ouch
   i++;
}

Personクラスのインスタンスはポインターであるため、コピーコンストラクターと代入operator =を作成しようとすると、新しいPersonオブジェクトに新しいBookを割り当てる必要があります。私は正しいですか?

はい、三つのルールに必ず従ってください

他の提案は、動的配列の代わりにstd :: vectorを使用し、可能であれば生のポインターの代わりにスマートポインターを使用することです。

于 2013-02-14T22:15:31.637 に答える
1

(仮定の下で、あなたは本のインスタンスを意味し、人のインスタンスを意味しませんでした)

人の深いコピーを作成するには、新しい本のインスタンスも作成する必要があります。深いコピーを使用すると、コピーとコピーされた本を保存しながら、元の人とその本を破壊することができます。

いくつかのユースケースでは、実際に両方の人が同じ本のオブジェクトを指すようにします。

このような場合、共有ポインターのようなものを使用して、本を指しているポインターの数を追跡する必要があります。

編集してクリアします。同じ本を持っている人が複数いて、その人に有効なデストラクタがある場合:

class Person {
public:
  ~Person() {
    delete m_pbook;
  }
protected:
  Book *m_pbook;
}

class Book {
  int foo;
}

Person a = new Person();  // book pointer is something like 0x12345678
Person b = new Person(a); // book pointer is identical 0x12345678

// delete a yields
delete a; // memory in 0x12345678 is freed up
b->book;  // AccessViolation / Segmentation Fault, the memory in 0x12345678 does not belong to your program any more.
于 2013-02-14T22:14:25.307 に答える