【问题标题】:Pointer issues with object in c++ vectorC++向量中对象的指针问题
【发布时间】:2018-10-02 04:05:51
【问题描述】:

所以我有一个 Node 类型,一个扩展节点类型的 Object1 类型,以及一个 geoType 类型(稍后将扩展为几种不同的几何更新类型)。

我正在尝试制作 Object1 的向量,当我调用 updateLoc 时,将调用附加的 geoType 上的更新函数,该函数会更新节点中的位置向量。

我这样设置是因为我希望有几种不同的地理类型来以不同的方式更新节点。不过我这里有个问题。

附上我的代码:https://onlinegdb.com/HJlNDlY2z

//classes.h #包括

class Node;
class geoType{
public:
    geoType();
    virtual ~geoType();
    void SetNode(Node *pointer);
    void Update();
private:
    Node* node;
};

class Node{
public:
    Node();
    virtual ~Node();
    void updateGeo();
    std::vector<double> getLoc();
    std::vector<double> location;
private:
};

class Object1: public Node{
public:
    Object1();
    virtual ~Object1();
    void setGeo(geoType* a);
    void updateLoc();
private:
    geoType* geo;
};

//classes.cpp

#include "Classes.h"

geoType::geoType(){
    node = 0;
}
geoType::~geoType(){}
void geoType::SetNode(Node *pointer){node = pointer;}
void geoType::Update(){node->location[0] = node->location[0] + 1;}

Node::Node(){location = std::vector<double>(3);}
Node::~Node(){}
void Node::updateGeo(){location[0] = location[0] + 1;}
std::vector<double> Node::getLoc(){return location;}

Object1::Object1(){geo = 0;}
Object1::~Object1(){}
void Object1::setGeo(geoType* a){geo = a;}
void Object1::updateLoc(){geo->Update();}

//main.cpp

int main()
{
    std::vector<Object1> objs;

    Object1 a;
    geoType* aGeo = new geoType;
    a.setGeo(aGeo);

    objs.push_back(a);
    aGeo->SetNode(&objs[0]);

    //objs[0].updateLoc();
    //std::cout<<objs[0].getLoc()[0] << '\n';
    //objs[0].updateLoc();
    //std::cout<<objs[0].getLoc()[0] << '\n';

    Object1 b;
    geoType* bGeo = new geoType;
    b.setGeo(bGeo);

    objs.push_back(b);
    bGeo->SetNode(&objs[1]);

    //for(int i = 0; i<objs.size();i++){
    //    objs[i].updateLoc();
    //    std::cout<<objs[i].getLoc()[0] << '\n';
    //}

    //for(int i = 0; i<objs.size();i++){
    //    objs[i].updateLoc();
    //    std::cout<<objs[i].getLoc()[0] << '\n';
    //}

    Object1 c;
    geoType* cGeo = new geoType;
    c.setGeo(cGeo);

    objs.push_back(c);
    cGeo->SetNode(&objs[2]);

    for(int i = 0; i<objs.size();i++){
        objs[i].updateLoc();
        std::cout<<objs[i].getLoc()[0] << '\n';
    }

    printf("Hello World");

    return 0;
}

由于某种原因,它似乎只正确更新了向量中的一个对象。我很困惑为什么。它正在正确循环,但输出并不像我预期的那样全部。另外,根据向量的大小,我有时会在 eclipse 中得到一个堆栈转储。

【问题讨论】:

标签: c++ oop pointers memory vector


【解决方案1】:

objs.push_back(b); 可能会使 obj[i] 上的先前指针无效(如果发生重新分配)

【讨论】:

  • 在 OPs 代码中添加 objs.reserve(3); 可以确认这一点。
猜你喜欢
  • 2011-10-01
  • 1970-01-01
  • 2011-02-11
  • 2010-10-13
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
相关资源
最近更新 更多