使用指针数组作为方法的参数

时间:2011-11-27 16:47:07

标签: c++ arrays pointers

我必须使用指向对象的数组,我还必须将它作为参数传递给方法。然而,这样做的方式使我无法理解。这是我用于初始化数组元素的方法。当我在main中取消引用它们时,它们的数据不正确(它们包含内存地址)。什么是正确的方法?我取消引用它们的方式可能是假的吗?

void createSquares(Square* squareArray[]){

    PropertySquare PropertySquare1(1,"purple",120);
    PropertySquare PropertySquare2(2,"purple",170);

    squareArray[1] = &PropertySquare1;
    squareArray[2] = &PropertySquare2;
.
.
.
}

主要:

Square *allSquares[22] ;
createSquares(allSquares);

cout<<"ID is: "<<allSquares[1]->getID()<<endl;
cin.get();

正如我所说,ID最终是一个内存地址。


根据答案

更新

我试过这个并且它也不起作用。我必须使用多态。

vector<Square*> allSquares;
createSquares(allSquares);

void createSquares(vector<Square*> &squares){

PropertySquare PropertySquare1(1,"purple",120);
PropertySquare PropertySquare2(2,"purple",170);

squares.push_back(&PropertySquare1);
squares.push_back(&PropertySquare2);

}

在main中:

for (vector<Square*>::iterator it=allSquares.begin(); it!=allSquares.end();it++){
   it->
}

它不允许我使用Square的虚函数,因为它是抽象的。 有什么建议吗?

3 个答案:

答案 0 :(得分:3)

你所做的一切都不好。弄清楚从哪里开始是很棘手的,所以让我从最后开始并提出正确的方法:

typedef std::unique_ptr<Square> square_ptr;

void createSquares(std::vector<square_ptr> & v)
{
  v.emplace_back(new PropertySquare1(1,"purple",120));
  v.emplace_back(new PropertySquare1(2,"green",370));
  // ...
}

int main()
{
  std::vector<square_ptr> allSquares;
  createSquares(allSquares);

  for (const auto & p : allSquares)
    std::cout << "ID is: " << p->getID() << std::endl;
}

现在打破你的问题:

首先,您要存储局部变量的指针。那些局部变量在函数范围的末尾死亡,指针变为悬空。解除引用是一个程序错误。

其次,要解决此问题,您应该创建动态对象:squareArray[1] = new PropertySquare1(1,"purple",120);但是,这也是有问题的。有人必须清理那些物品!您可以迭代数组并在每个元素上调用delete

第三,22是一个“幻数”(因为它既不是0也不是1)。这不应该是硬编码的。如果该数字确实是编译时常量,请将其命名为某处。

第四,无论哪种方式,都不要使用原始数组。如果在编译时已知大小,则使用std::array;如果在运行时确定大小,则使用std::vector

第五,将所有这些放在一起,智能指针的动态容器可以解决您的所有后顾之忧。这就是我的代码中提供的那个。另一种是智能指针的静态数组,根本不会使用初始化函数,而是在现场进行初始化:

const std::size_t nfuncs = 22;
std::array<square_ptr, nfuncs> allSquares {
  new PropertySquare1(1,"purple",120),
  new PropertySquare1(2,"green",370),
  // ...
};

答案 1 :(得分:1)

错误的是

PropertySquare PropertySquare1(1,"purple",120);
PropertySquare PropertySquare2(2,"purple",170);

createSquares返回的那一刻被销毁。因此,当您打印这些ID时,您的数组包含垃圾。

答案 2 :(得分:0)

因为PropertySquare变量是在堆栈中声明的,所以一旦函数返回它们就会被销毁。你想在堆中声明它们而不是

squareArray[1] = new PropertySquare PropertySquare1(1,"purple",120);
squareArray[2] = new PropertySquare PropertySquare1(2,"purple",170);

并通过调用delete allSquares[1]

在main中删除它们