繁体   English   中英

C ++从文件读入指针向量

[英]C++ reading in from file to vector of pointers

我的问题是我有一个基类和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++;
            };
        }
    }

到目前为止,它可以正常工作,可以编译并且可以正常运行,但是当我尝试通过robots[i].getBattery();访问函数时robots[i].getBattery(); 程序冻结。 似乎指针只是指向无处,但我不知道为什么:(

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

如果将项目推入向量中并采用指向它的指针,则只有当向量的存储没有移动或无效时,该指针才有效。 在您的情况下,重复的push_back()调用很可能会触发向量重新分配,并且不能保证这种情况可以就地发生,因此元素可能会移动到新的内存位置,但是显然指针不会更新。 因此,您最终将获得指向无处的指针。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM