我的问题是我有一个基础和3个子类,我想创建一个向量,我可以放置所有3个子类的代表的元素。这是处理从文件中读入的代码的一部分
vector<Robot*> robots;
vector<Mac> mac;
vector<Eco> eco;
vector<Pro> pro;
vector<int> charge;
vector<int> deliver;
try {
string s;
ifstream f;
do {
cout << "Add meg a filenevet" << endl;
cin >> s;
f.open(s.c_str());
} while (!f.good());
cout << "adatok beolvasasa..." << endl;
int napok;
if (!(f >> napok)) throw 1;
charge.resize(napok);
deliver.resize(napok);
for (int i = 0; i<napok; i++) {
if (!(f>>charge[i])) throw 1;
if (!(f>>deliver[i])) throw 1;
}
string type, name;
int battery;
int m = 0; int e = 0; int p = 0;
std::string line;
while (std::getline(f, line)) {
stringstream ss(line);
if (ss >> type && ss >> name && ss >> battery) {
if (type=="Mac") {
cout << "mac" << endl;
Mac r = Mac(name,battery);
mac.push_back(r);
robots.push_back(&mac[m]);
m++;
};
if (type=="Eco") {
cout << "eco" << endl;
Eco r = Eco(name,battery);
eco.push_back(r);
robots.push_back(&eco[e]);
e++;
}
if (type=="Pro") {
cout << "pro" << endl;
Pro r = Pro(name,battery);
pro.push_back(r);
robots.push_back(&pro[p]);
p++;
};
}
}
到目前为止,它可以编译并运行,但是当我尝试访问函数ex robots[i].getBattery();
时
程序冻结了。
似乎指针只指向无处,但我不明白为什么:(
答案 0 :(得分:1)
问题在于,您有两种独立的方式来访问对象,而两者之间没有任何同步。
如果将项目推入向量然后指向它,指针仅在向量的存储未被移动或无效时才有效。在您的情况下,重复的push_back()调用可能会触发向量重新分配,并且无法保证这可能发生在适当的位置,因此元素可能会移动到新的内存位置,但显然指针不会更新。因此,你最终会指向无处。
有一组容器来容纳数据,而另一个只容纳指向所述数据的容器看起来对我来说是非常糟糕的设计。在我看来,你有两个选项来改进代码并解决你遇到的问题。在这两种情况下,您只需要一个容器来保存指向多态元素的指针,这就是您声明容器的方式:
1)使用boost::ptr_vector
存储指向多态对象的指针。此容器旨在保存指针(std::vector
不是指针,后者具有值语义)并负责对其中包含的对象进行生命周期管理。
2)如果你不能使用boost,请使用std::vector<std::shared_ptr<Robot> >
来保存指向多态对象的指针。
在这两种情况下,您都不再使用按值保存项目的容器,而是在if语句中,在堆上分配对象,然后将指针放入容器中。