繁体   English   中英

C ++迭代器作为类方法中使用的类成员

[英]C++ iterator as class member used in class method

我有以下代码。

最后的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;
    }

你的问题是,迭代it不被更新/每次使用后无效push_back 最后插入后,它仍然指向“无”,就像从一开始一样。

灵魂很简单-更新迭代器。 添加用于添加新元素的方法:

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;
}

暂无
暂无

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

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