我有一个指向一个对象的指针,我将在一个方法中使用它。但我需要在另一种方法中再次使用相同的指针如何在不声明为全局对象的情况下实现此目的。这是我动态的招标成就的一部分 Shape是父类,Rectangle是子类。
int main(){
switch (choice){
case 1:
create();
break;
case 2:
process();
break;
}
}
create(){
Shape *shape[3];
shape[0]=&objRectangle;
}
process(){
for(int i=0;i<3;i++){
shape->print; // I want to acchieve like this.
}
现在我无法做到这一点,一旦它退出创建过程,形状对象就消失了。 请协助。
答案 0 :(得分:1)
在call stack上创建局部变量。这意味着当函数完成时,这些变量总是被销毁。
目前还不清楚如何检索Rectangle
对象以及如何处理来自粘贴代码的Shape
对象指针数组。但是你可能需要两件事:
Rectangle
不得在堆栈中,但必须在堆上分配。shape
数组。我建议您创建一个包装函数的类,并使用Shape
和new
关键字动态实例化和删除delete
个对象。我相信这是最简单的方法。这样的事情应该有效:
/* interface */
class Example
{
Shape *shape[3];
public:
Example();
~Example();
void create();
void process();
};
/* implementation */
Example::Example() {}
Example::~Example()
{
delete shape[0];
}
void Example::create()
{
shape[0] = new Rectangle();
}
void Example::process()
{
shape[0]->print();
}
/* main */
int main()
{
Example example();
example.create();
example.process();
}
答案 1 :(得分:1)
我会像其他人一样建议让图书馆为你管理记忆。
为了能够使用动态绑定和std::vector
,您应该开始(在您的主体中)分配您的矢量
std::vector<Shape*> shape(3);
这样做可以访问动态绑定的矢量条目
shape[0]->process();
糟糕的是你仍然需要管理向量条目指向的内存(实际上它们只是C指针)。因此,你为什么不考虑做
std::vector< std::tr1::shared_ptr< Shape > > shape(3);
这样做时,smart pointer std::tr1::shared_ptr
会在指向Shape
对象超出范围时为您释放内存。
此外,在此设置中,您应该将Shape
- 类型对象分配为
shape[0] = std::tr1::shared_ptr< Shape >(new Rectangle);
正确创建所需的智能指针。
最后,矢量shape
应该通过引用(或const
引用)传递给使用它的函数。