因此,我有一个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]
上的先前指针无效(如果发生重新分配)