2013-01-02 21 views
0

我的問題是我有一個基類和3個子類,我想創建一個向量,我可以放置所有3個子類的代表元素。下面是它處理從文件從文件讀入指針向量的C++

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(); 程序凍結。 似乎指針只是指向無處但我不知道爲什麼:(

+0

你打電話給'機器人[i] .getBattery();'?如果'mac','eco'和'pro'被破壞,他們的成員也是如此。這導致「機器人」持有指向無效對象的指針。 – Oswald

+0

它們不會被破壞:/將這一切全部寫入主函數(希望它會使它更容易一些),我也將它稱爲主函數。 – Andesz

回答

1

的問題是,你有你的訪問對象,而無需任何兩者之間的同步的兩個獨立的方式。

如果您推送項,然後將一個指針指向它,只有在矢量的存儲沒有移動或失效的情況下,指針纔有效。在你的情況下,重複的push_back()調用可能會觸發矢量重新分配,並且不能保證這可能會發生,所以元素可能會移動到一個新的內存位置,但很明顯指針不會更新。因此,最終指向無處指向。

擁有一組容器來保存數據,另一個容器只保存指向所述數據的指針,這對我來說看起來是非常糟糕的設計。正如我所看到的,您有兩種選擇來改進代碼並修復遇到的問題。在這兩種情況下,您只需要一個容器來保存指向多態元素的指針,這只是您聲明容器的方式:

1)使用boost::ptr_vector來存儲指向多態對象的指針。這個容器被設計爲容納指針(其中std::vector不是,後者具有值語義)並且負責其中包含的對象的生命週期管理。 2)如果你不能使用boost,請使用std::vector<std::shared_ptr<Robot> >來保存指向多態對象的指針。

在這兩種情況下,您都不用按值存儲項目的容器,並在if語句中分配堆中的對象,然後將指針放入容器中。