c ++ vector

时间:2018-04-21 17:47:56

标签: c++ oop pointers memory vector

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

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

我是这样设置的,因为我希望有几种不同的geoTypes以不同的方式更新Node。我在这里有一个问题。

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

// classes.h     #include

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中获得堆栈转储。

1 个答案:

答案 0 :(得分:4)

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