所以我有一个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中获得堆栈转储。
答案 0 :(得分:4)
objs.push_back(b);
可能使obj[i]
上的前一个指针无效(如果重新分配发生)