2015-04-01 64 views
0

我有以下代碼。C++迭代器作爲類方法中使用的類成員

最後的for循環應該通過CCarList類的對象,打印出Car結構的a_rz和vin,並在AtEnd()方法返回true時停止。

但它並沒有停止,而且當我嘗試達到a_rz和vin的值時,它給出了分段錯誤。

有人請解釋如何在我的CCarList類中正確使用迭代器?

感謝

typedef struct Car { 

     string a_rz; 
     unsigned int vin; 
    }Car; 

    class CCarList 
    { 
     public: 
     string   RZ   (void) const; 
     unsigned int VIN   (void) const; 
     bool   AtEnd  (void) const; 
     void   Next   (void); 

     vector<Car*> vCar; 
     vector<Car*>::const_iterator it = vCar.begin(); 
     public: 
         CCarList  (void){} 
         ~CCarList (void){} 
    }; 

    string CCarList::RZ (void) const { 
     return "ahoj"; //(**it).a_rz; 
    } 
    unsigned int CCarList::VIN (void) const{ 
     return 5; //(**it).vin; 
    } 
    bool CCarList::AtEnd (void) const { 

     if(it == vCar.end()) return true; 
     return false; 
    } 
    void CCarList::Next (void){ 
     it++; 
    } 

    int main() { 


    Car *a, *b, *c; 
    a = new Car; 
    b = new Car; 
    c = new Car; 

    (*a).a_rz = "abc"; 
    (*a).vin = 45; 
    (*b).a_rz = "dfg"; 
    (*b).vin = 65; 
    (*c).a_rz = "jkl"; 
    (*c).vin = 23; 

    CCarList list_of_cars; 
    list_of_cars.vCar.push_back(a); 
    list_of_cars.vCar.push_back(b); 
    list_of_cars.vCar.push_back(c); 

    for (; ! list_of_cars . AtEnd(); list_of_cars . Next()) 
     cout << list_of_cars . RZ() << ", " << list_of_cars . VIN() << endl; 


    return 0; 
    } 
+0

你的代碼壞了。只有當你需要開始迭代時,該迭代器應該被設置爲開始。調用'push_back'可能從一開始就使其'無效'。另外,如果我想遍歷列表兩次或更多次,那麼將迭代器設置爲開始的函數在哪裏?不用說,擁有一個迭代器的成員是一個奇怪的(甚至可能說是有缺陷的)設計。 – PaulMcKenzie 2015-04-01 11:04:00

+0

此代碼是我的不同程序的一部分。這裏主函數(除了循環)在函數中存在,它應該創建一個臨時對象來遍歷向量,並且在該函數中,我從該數據庫的不同向量中分配這個向量內容。方法RZ(),VIN(),AtEnd()和Next()必須在那裏 - 它的任務。我無法找出任何其他方式來做到這一點,使用迭代器作爲類成員。你的建議是什麼? – marianne 2015-04-01 11:52:06

回答

0

您的問題是迭代it不被更新/每push_back後失效。在最後一次插入後,它仍然指向「沒有」,因爲它從一開始就是。

Soultion很簡單 - 更新你的迭代器。添加方法添加新元素:

void CCarList::Add(Car* car) 
{ 
    vCar.push_back(car); 
    it = vCar.begin(); 
} 

,然後只是:

list_of_cars.Add(a); 
list_of_cars.Add(b); 
list_of_cars.Add(c); 

上述問題也有關,你想換vector,並提供vector已經提供相同的功能。考慮在該結構內移動與Car結構有關的功能。然後在CCarList中只留下與CCarList相關的方法。只是一小段代碼來向你展示我的意思:

typedef struct Car { 
    string a_rz; 
    unsigned int vin; 
} Car; 

class CCarList { 
public: 
    vector<Car*> vCar; 
    CCarList(void){} 
    ~CCarList(void){} 
}; 

int main() { 

    Car *a, *b, *c; 
    a = new Car; 
    b = new Car; 
    c = new Car; 

    a->a_rz = "abc"; 
    a->vin = 45; 
    b->a_rz = "dfg"; 
    a->vin = 65; 
    c->a_rz = "jkl"; 
    c->vin = 23; 

    CCarList list_of_cars; 

    list_of_cars.vCar.push_back(a); 
    list_of_cars.vCar.push_back(b); 
    list_of_cars.vCar.push_back(c); 

    for(auto car : list_of_cars.vCar) 
     cout << car->a_rz << ", " << car->vin << endl; 

    return 0; 
} 
+0

非常感謝,現在對我來說是有道理的:) ...並且我知道可能有更簡單的方法來做到這一點,但for循環在學校給了我們,我們不得不根據這個來實現這個類:) – marianne 2015-04-01 11:37:21