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; } |
现在来分解你的问题:
首先,您要存储局部变量的指针。这些局部变量死在函数范围的末尾,指针就会悬空。取消引用是一个程序错误。
第二,要解决这个问题,您应该创建动态对象:
第三,
第四,不管怎样,不要使用原始数组。如果在编译时已知大小,则使用
第五,把它们放在一起,一个充满智能指针的动态容器可以解决所有的问题。这就是我的代码中显示的那个。另一种选择是智能指针的静态数组,它根本不使用初始化函数,而是直接初始化:
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); |
在
因为
1 2 | squareArray[1] = new PropertySquare PropertySquare1(1,"purple",120); squareArray[2] = new PropertySquare PropertySquare1(2,"purple",170); |
并通过调用