更改对象数组的指针

时间:2013-09-23 09:59:39

标签: c++ pointers

我对指针

有点新意

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

Record book[10];

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

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

}while()

有人可以建议我将书设置为tempBook的内容吗?

谢谢!

3 个答案:

答案 0 :(得分:4)

基本上,您必须了解automatic and free-store objects与其生命周期之间的区别,才能理解以下解释。

对象

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的所有内容复制到tempBook s。

指向对象的指针

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

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::vector s。低级别的内存处理,无论多么令人着迷,都会导致难以找到错误;把它留给容器类来为你处理它是明智的。

答案 1 :(得分:0)

您可以执行循环以将值从tempBook分配给book。例如

for(int i = 0; i < 10; i++)
{
    book[i].property = tempBook[i].property;
}

答案 2 :(得分: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做什么修改都不会反映书籍对象。我的建议是使用vector代替对象数组。

因此,要将书籍内容设置为tempBook,您可以使用上述方法。