在C ++中实例化构造函数内的列表

时间:2012-03-11 23:25:26

标签: c++ list constructor

我正在尝试用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);  
} 

我没有得到任何构建错误,但是调试器对我大喊“Expression:list insert iterator outside range”。我相信我没有在构造函数中初始化列表,这就是原因。我该怎么做? 感谢

现在所有内容都按插入排序,但是我从同一个列表中删除时遇到问题 我认为它与这些“可爱的”指针有关。为了得到这一次,我的主要是我正在创建一个类型为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 个答案:

答案 0 :(得分:3)

您的列表将在构造函数中自动初始化,并且您不需要迭代器作为类成员。要将对象添加到列表中,只需调用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 :(得分:1)

您的列表已初始化正常。

调试器正在尝试提供帮助,并向您显示it迭代器指向的元素。由于您尚未向列表中添加任何元素,因此列表为空,myList.begin()未指向有效元素。

将一个元素添加到列表后,错误消息就会消失。但是,我不确定您的it迭代器是否会自动生效,或者您是否需要再次调用myList.begin()

您尚未发布Object类定义,但删除可能不起作用,因为您的Object类未正确实现operator==。与指针无关(除非Object使用指针内部)或传递值。

将您的方法声明为void addObject(Object obj)而不是void addObject(const Object& obj),这意味着每次调用都会创建Object的额外实例。

答案 2 :(得分:0)

我在这里看到的唯一一件事就是你可能正在使用list.end(),你在这里没有展示过。请记住,list.end()实际指向列表末尾,而不是列表的实际最后一个成员。要附加到列表,最好使用'push_back'。