【问题标题】:Is there a way to work around scope by using pointers?有没有办法通过使用指针来解决范围?
【发布时间】:2013-12-08 02:08:30
【问题描述】:

取下面的代码

void save(){
    Classname object(aString, aInt);
    this->getVector().push_back(&object);
}

我正在尝试将对象的副本保存到此类的向量中,但我知道这是行不通的,因为一旦我离开 save(),对象就会被删除,所以我的问题是怎么做我解决这个问题?我会很感激一些代码示例,因为我正在从 java 迁移并且可能不理解其中的一些指针魔法。

编辑:英文 edit2:复制粘贴永远不起作用!

【问题讨论】:

  • 使用智能指针。它们维护一个引用计数,并在最后一个引用被释放时自动释放内存。
  • 另外,您可以将向量设为vector<Classname> 而不是vector<Classname*>
  • @Joe Z 但这与多态性不冲突?
  • 您可能想要发布 getVector() 的返回类型。如果它是向量的副本,您可能有两个错误。 &l 也不在范围内,可能希望将其修复为 &object
  • @MikeNeto:是的,如果您需要它是多态的,那么您确实需要使用指针。您可以使用智能指针向量,如上面 meagar 建议的那样。

标签: c++ pointers scope


【解决方案1】:

首先,不需要this->,你可以直接说

getVector().push_back(...);

第二,既然你用了this->,我推断savegetVector是同一个类的两个成员函数;如果getVector 所做的只是访问一个也是该类成员的向量(没有任何技巧,如延迟实例化),那么您也不需要它,您可以直接处理该向量:

theVector.push_back(...)

现在回答你的问题。你是对的,object 将超出范围——如果它在堆栈上。但是你可以在堆上动态构建它,它会一直存在直到被删除:

void save(){
    Classname *ptr = new Classname(aString, aInt);
    theVector.push_back(ptr);
}

现在ptr 将超出范围,但添加到向量中的ptr 的副本不会,并且那个 指针仍将指向该对象。

由于您想使用多态性,我想您希望向量包含基类指针,这些指针实际上可以指向派生类的对象。没问题:

void save(){
    Animal *ptr = new Aardvark(aString, aInt);
    theVector.push_back(ptr);   // <-- the vector is of type vector<Animal*>
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2017-07-20
    • 2020-05-02
    相关资源
    最近更新 更多