2017-05-10 57 views
1

我必須編寫一個能夠存儲大學項目電影的程序。直到他們決定寫我自己的迭代器來打印出存儲電影的異種集合(有3種不同的電影類)之前,這一切都很好。我完全不知道問題可能是什麼。C++自寫的迭代器 - 從位置0x00000000讀取違規讀取異常

這是我對heterogen集合類:

Class Katalogus { 
    Film* F[100]; 
    int meret; 
public: 
    Katalogus() :meret(0) {} 
    void add(Film* mit) { 
     F[meret++] = mit; 
    } 
    void torol(int mit); 
    void keres_int(int mit); 
    void keres_str(string mit); 
    void kiir(ostream& os); //This is the print method 
    Film* beolvas(istream& is, string& line); 
    ~Katalogus(); 
    class iterator; 
    iterator begin() { 
     return iterator(*this); 
    } 
    iterator end() { 
     return iterator(*this, 100); 
    } 
    class iterator { 
     Film *p, *pe; 
    public: 
     iterator():p(0),pe(0){} 
     iterator(Katalogus& a, int ix=0):p(*(a.F+ix)),pe(*(a.F+100)){} 
     iterator& operator++() { 
      if (p != pe)++p; 
      return *this; 
     } 
     bool operator!=(const iterator &i) { 
      return (p != i.p); 
     } 
     Film& operator*() { 
      if (p != pe) return *p; 
      else throw out_of_range("Hibas indirekcio"); 
     } 
    }; 

}; 

基爾()函數:

void Katalogus::kiir(ostream& os) { 
    for (int i = 0; i < meret; ++i) { 
     os << i + 1 << ". "; //just a number in every row 
     F[i]->Print(os); //calling the print function of my stored movies 
     os << endl; 
    } 

在我的main()我試着用短代碼來測試它:

Katalogus *DB = new Katalogus; 
ifstream DataBase_in; 
DataBase_in.open("Katalogus.txt"); 
string line; 
while (getline(DataBase_in,line)){ //reading from file and adding it to the collection 
    DB->add(DB->beolvas(DataBase_in, line)); //beolvas and add are both working functions 
} 
DataBase_in.close(); 

for (Katalogus::iterator it = DB->begin(); it != DB->end(); ++it) { 
    (*it).Print(cout); //and this is where i get the exception 
} 

This is the exception

我的原始kiir()函數工作正常,但我必須用它使用我的迭代器來替換它。如果有人能夠幫助我,我會真的appriciate它! :)

+0

你知道哪一行代碼特別拋出異常嗎? – 7Nate9

+2

在調用'Print'之前確保'* it'不是'nullptr'。 –

+0

從異常的文本看來,問題在於您正在取消引用空指針。 – Justin

回答

2

您的end返回數組末尾的迭代器。所以你的迭代器將遍歷數組中未填充的元素。您的原始for循環只遍歷填充的元素。更改end功能如下:

iterator end() { 
    return iterator(*this, meret); 
} 

這將參照第一填充單元陣列中(或一個過去的結束,如果數組完全填滿),從而導致你的迭代器表現得像你的循環。

+0

感謝您的回答,但我已經嘗試過這一點,它無濟於事。 試過調試,我仍然得到相同的異常。沒有改變。 :/ –

+0

@VrbovszkiBence你的調試揭示了什麼? –

+0

事實證明,我的操作符++毀了一切。出於某種原因,它沒有正確地增加我的迭代器,並使它指向奇怪的內存地址。 –

相關問題