gpt4 book ai didi

C++从文件读入指针 vector

转载 作者:行者123 更新时间:2023-11-28 07:49:35 25 4
gpt4 key购买 nike

我的问题是我有一个基类和 3 个子类,我想制作一个 vector ,我可以在其中放置代表所有 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();程序卡住。似乎指针只是指向无处,但我不知道为什么 :(

最佳答案

问题是您有两种独立的方式来访问您的对象,而这两种方式之间没有任何同步。

如果您将一个项目压入一个 vector ,然后获取指向它的指针,则该指针仅在 vector 的存储没有被移动或无效时才有效。在您的情况下,重复的 push_back() 调用很可能会触发 vector 重新分配,并且不能保证这会发生在适当的位置,因此元素可能会移动到新的内存位置,但显然指针不会更新。因此,您最终会得到无处可去的指针。

用一组容器来保存数据,而另一组容器只保存指向所述数据的指针,这对我来说是非常糟糕的设计。正如我所见,您有两种选择来改进代码和解决您遇到的问题。在这两种情况下,您只需要一个容器来保存指向多态元素的指针,这就是您声明容器的方式:

1) 使用 boost::ptr_vector存储指向多态对象的指针。此容器旨在保存指针(std::vector 不是,后者具有值语义)并负责其中包含的对象的生命周期管理。

2) 如果不能使用 boost,请使用 std::vector<std::shared_ptr<Robot> >保存指向多态对象的指针。

在这两种情况下,您都取消了按值保存项目的容器,而在 if 语句中,您在堆上分配对象,然后将指针放入容器中。

关于C++从文件读入指针 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14128772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com