0

我对指针有点陌生

在我的程序中,我定义了一个“记录”类和两个数组

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));

这会将 s 的所有内容复制booktempBooks。

指向对象的指针

如果您想要一组指向书籍的指针,那么您必须声明tempBookRecord数据类型的指针而不是对象。

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

指向指针的指针

如果您想在堆栈上创建 10 本书,然后将它们复制到另一个数组(在堆栈中),那么您可以std::copy像上面那样使用。如果您想在免费存储中创建对象(使用 new/delete),则创建它们并使任意数量的指针指向这些匿名对象:

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

您可以循环将 tempBook 中的值分配给 book。例如

for(int i = 0; i < 10; i++)
{
    book[i].property = tempBook[i].property;
}
于 2013-09-23T10:03:47.857 回答
0

定义一个副本 c'tor 并将一个对象分配给另一个对象,没有任何麻烦。

      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 回答