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

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

之所以设置它,是因为我想拥有几种不同的geoType以不同的方式更新Node。我这里有个问题。

附上我的代码: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中获得堆栈转储。

最佳答案

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

07-27 23:05