Создание списка внутри конструктора в C ++ - PullRequest
0 голосов
/ 12 марта 2012

Я пытаюсь создать список внутри класса в C ++, и я не понимаю, что я делаю неправильно

class Car(){  
public:  
    Car();  
    ~Car();  
    list <Objects> myList;  //a list of some objects from one of my classes  
    list <Objects>::iterator it;  
    void addObject(Object obj);  
    void removeObject(Object obj);  
};  

Car::Car(){  
    //what do I need to add to initialize the list
    it = myList.begin();
};  

void addObject(Object obj){  
    //myList.insert(it, obj);  
    myList.push_back(obj);
}  

void removeObject(Object obj){  
    myList.remove(obj);  
} 

Я не получаю никаких ошибок при сборке, однако отладчик кричиту меня "Выражение: список итератор вставки вне диапазона".Я считаю, что я не инициализирую список внутри моего конструктора, и это причина, почему.Как мне это сделать?* * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * *1006* * * * * * * * * * * * *1006* * * * * * * * * * * * * * * * * * * * * * * * * * * * * Из-за этих "прекрасных" указателей.Чтобы получить это раз и навсегда, я в основном создаю объект типа Car.Затем я создаю несколько объектов типа Object.Затем я добавляю их в свой объект Car, используя приведенный выше код.Почему я не могу их удалить?И самое главное: сколько экземпляров одного и того же объекта я создал, используя этот код:

int main(){  
    Car myCar = Car();  
    Object one = Object("first object");  
    Object two = Object("second object");  
    Car.addObject(one);  
    Car.addObject(two);  
    Car.removeObject(one);  //doesn't work???
}  

Может кто-нибудь объяснить мне, что я делаю неправильно?Имеет ли что-нибудь отношение к моим проходящим объектам по значению?Как правильно делать вышесказанное?
Спасибо.

Ответы [ 3 ]

3 голосов
/ 12 марта 2012

Ваш список будет автоматически инициализирован в вашем конструкторе, и вам не нужен итератор в качестве члена класса.Чтобы добавить свой объект в список, вам нужно просто вызвать push_back:

void addObject(Object obj){  
myList.push_back(obj);  
}  

См. http://www.cplusplus.com/reference/stl/list/push_back/

Чтобы вставить в определенное место, см .: http://www.cplusplus.com/reference/stl/list/insert/

Есливы будете произвольно решать, куда вставить новый объект, тогда вам нужно будет определить, где каждый раз, используя find (), если вы собираетесь всегда вставлять в начале или в конце, тогда достаточно просто вызвать

// insert in arbitrary location
myList::iterator it = myList.find(val);
myList.insert(it, obj);
// OR insert at beginning
myList.push_front(obj); // to insert at end see above
1 голос
/ 12 марта 2012

Ваш список был инициализирован очень хорошо.

Отладчик пытается помочь и показать вам элемент, на который указывает итератор it. Поскольку вы не добавили никаких элементов в список, список пуст, и myList.begin() не указывает на допустимый элемент.

После добавления элемента в список сообщение об ошибке исчезает. Однако я не уверен, что ваш it итератор автоматически станет действительным или вам нужно будет снова вызвать myList.begin().

Вы не опубликовали определение класса Object, но удаление, вероятно, не работает, поскольку ваш класс Object не реализует operator== должным образом. Ничего общего с указателями (если Object не использует указатели внутри) или передачей по значению.

Объявление ваших методов как void addObject(Object obj) вместо void addObject(const Object& obj) означает, что для каждого вызова вы создадите дополнительный экземпляр Object.

0 голосов
/ 12 марта 2012

Единственное, что я вижу здесь, это то, что вы можете использовать list.end () где-то, что вы здесь не показываете.Помните, что list.end () фактически указывает за конец списка, а не за фактическим последним членом списка.Для добавления в список лучше использовать push_back.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...