关于c ++:使用指针数组作为方法的参数

Using array of pointers as parameter to method

我必须使用指向对象的指针数组,并且必须将它作为参数传递给方法。然而,做这件事的方法却让我难以捉摸。下面是我用来初始化数组元素的方法。当我在主目录中取消引用它们时,它们的数据是不正确的(它们包含内存地址)。正确的方法是什么?我取消引用它们的方式可能是错误的吗?

1
2
3
4
5
6
7
8
9
10
11
void createSquares(Square* squareArray[]){

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

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

在主要方面:

1
2
3
4
5
Square *allSquares[22] ;
createSquares(allSquares);

cout<<"ID is:"<getID()<<endl;
cin.get();

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

根据答案更新:

我试过这个方法,但效果不太好,我必须使用多态性。

1
2
3
4
5
6
7
8
9
10
11
12
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);

}

在主要方面:

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

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


你所做的一切都不好。要想知道从哪里开始是很困难的,所以让我从末尾开始,并给出正确的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

第五,把它们放在一起,一个充满智能指针的动态容器可以解决所有的问题。这就是我的代码中显示的那个。另一种选择是智能指针的静态数组,它根本不使用初始化函数,而是直接初始化:

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


什么是假的?

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

createSquares返回时被摧毁。因此,当您打印这些ID时,数组包含垃圾。


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

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

并通过调用delete allSquares[1]等将其删除。