如何从另一个函数中的一个函数使用指向对象的指针?

时间:2012-10-23 18:58:34

标签: c++ arrays object-lifetime

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

现在我无法做到这一点,一旦它退出创建过程,形状对象就消失了。 请协助。

2 个答案:

答案 0 :(得分:1)

call stack上创建局部变量。这意味着当函数完成时,这些变量总是被销毁。

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

  1. 您的Rectangle不得在堆栈中,但必须在堆上分配。
  2. 您需要访问要访问它的所有地方的shape数组。
  3. 我建议您创建一个包装函数的类,并使用Shapenew关键字动态实例化和删除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引用)传递给使用它的函数。