0

私はポインターに少し慣れていません

私のプログラムでは、クラス「レコード」と2つの配列を定義しました

Record book[10];

do{
    Record tempBook[10];
    // ... Some sorting command

    // Set "book" to the content of "tempBook" here

}while()

book を tempBook のコンテンツに設定するために何をすべきか誰かが提案できますか?

ありがとう!

4

3 に答える 3

4

基本的に、以下の説明を理解するには、自動格納オブジェクトと自由格納オブジェクトの違いとその有効期間を理解する必要があります。

オブジェクトからオブジェクトへ

std::copy(book, book + 10, tempBook);
// if you compiler supports C++11, then
// std::copy(std::cbegin(book), std::cend(book), std::begin(tempBook));

bookこれにより、s のすべての内容がs にコピーされますtempBook

オブジェクトへのポインタ

一連のポインターが本を指すようにする場合は、オブジェクトとしてではなく、データ型tempBookのポインターとして宣言する必要があります。Record

Record books[10];
// later
Record *tempBooks[10];
for(int i = 0; i < 10; ++i)
{
   tempBooks[i] = &books[i];
}

ポインターへのポインター

スタックに 10 本の本を作成し、それらを (スタック内の) 別の配列にコピーする場合は、上記のように使用できますstd::copy。(新規/削除を使用して) フリー ストアにオブジェクトを作成する場合は、それらを作成し、任意の数のポインターがそれらの無名オブジェクトを指すようにします。

Record *books = new Record[10];
// later
Record *tempBooks = books;

スマートポインター

ただし、メモリ処理を改善し、メモリ リークを回避するために、C++11 が提供するスマート ポインターを使用することをお勧めします。共有ポインタを使用します。

#include <memory>
std::shared_ptr<Record> spBooks[10];
spBooks[0] = make_shared<Record>(/*pass constructor arguments*/);

// later
std::shared_ptr<Record> spTempBooks[10];
std::copy(spBooks, spBooks + 10, spTempBooks);

さらに良いのは、std::vectors を使用することです。低レベルのメモリ処理は、魅力的に見えるかもしれませんが、見つけにくいバグにつながります。コンテナー クラスに処理を任せるのが賢明です。

于 2013-09-23T10:07:06.843 に答える
0

コピー元を 1 つ定義し、手間をかけずに 1 つのオブジェクトを別のオブジェクトに割り当てます。

      class Record {

         public:
               Record(const Record& rec) {
                    //do your assignment from rec to this pointer
               } 
      };

このように定義すると、

     do{
         Record tempBook[10];
         // ... Some sorting command
         for (size_t i=0; i<10; i++)  //Define array size in macro
         {
                tempBook[i]=book[i];
         }
     }while()

ここで tempBook は while ループの中で生きています。tempBook をどのように変更しても、ブック オブジェクトは反映されません。私のアドバイスは、オブジェクトの配列の代わりにベクトルを使用することです。

したがって、本のコンテンツを tempBook に設定するには、上記の方法を使用できます。

于 2013-09-23T10:59:26.163 に答える