我必须使用指向对象的数组,我还必须将它作为参数传递给方法。然而,这样做的方式使我无法理解。这是我用于初始化数组元素的方法。当我在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的虚函数,因为它是抽象的。 有什么建议吗?
答案 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]
等