0

我有一个指向我将在一种方法中使用的对象的指针。但我需要在另一种方法中再次使用相同的指针,如何在不声明为全局对象的情况下实现这一点。这是我的动态投标成就的一部分 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.
}

现在我不能这样做了,形状对象一旦退出创建过程就消失了。请协助。

4

2 回答 2

1

局部变量是在调用堆栈上创建的。这意味着这些变量总是在函数完成时被销毁。

目前尚不清楚如何检索Rectangle对象以及如何处理Shape粘贴代码中的对象指针数组。但你可能需要两件事:

  1. Rectangle不能在堆栈上,但必须在堆上分配。
  2. 您需要shape在要访问它的所有地方访问该阵列。

我建议您创建一个类,该类将包装您的函数并使用和关键字Shape动态实例化和删除对象。我相信这是最简单的方法。像这样的东西应该工作:newdelete

/* 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();
}
于 2012-10-23T19:31:46.120 回答
1

我建议像其他人一样让图书馆为您管理内存。

为了能够使用动态绑定,std::vector您应该开始(在您的主要)分配您的向量

    std::vector<Shape*> shape(3);

这样做你可以访问你的动态绑定向量条目

    shape[0]->process();

坏事是您仍然必须管理向量条目指向的内存(实际上它们只是 C 指针)。因此,你为什么不考虑做

    std::vector< std::tr1::shared_ptr< Shape > > shape(3);

?

这样做,当指向的对象超出范围时,智能指针 std::tr1::shared_ptr将为您释放内存 。Shape

此外,在此设置中,您应该将 Shape-type 对象分配为

     shape[0] = std::tr1::shared_ptr< Shape >(new Rectangle);

正确创建您需要的智能指针。

最后,向量shape应该通过引用(或const引用)传递给使用它的函数。

于 2012-10-24T08:54:26.380 回答