【发布时间】:2012-03-11 23:25:25
【问题描述】:
我正在尝试在 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);
}
我没有收到任何构建错误,但是调试器对我大喊“表达式:列表插入迭代器超出范围”。我相信我没有在构造函数中初始化列表,这就是原因。我该怎么做? 谢谢
现在所有内容都已通过插入进行排序,但是我在从同一个列表中删除时遇到了问题。
我认为这与这些“可爱”的指针有关。为了一劳永逸地得到这个,我主要创建了一个 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???
}
有人可以向我解释我做错了什么吗?我按值传递对象有什么关系吗?执行上述操作的正确方法是什么?
谢谢。
【问题讨论】:
-
就目前而言,代码看起来不错,但您应该确保您了解容器的迭代器失效行为。该列表将被正确初始化(到一个空列表)。
-
@Kerrek :这将默认初始化一个
std::list<>::iterator,这是不行的。 -
@ildjarn:有什么问题?迭代器可以默认初始化。稍后,
it在构造函数主体中获得分配给它的有效值。不优雅,但实用。 -
@Kerrek :显然我很困惑。我在想容器的哨兵迭代器是不合法的,但事实上,只要你在使用它们之前为它们分配一个有效值,它们就是合法的,这是在这里完成的。
-
我使用迭代器来显示存储在列表中的所有对象,如果/当我想将新对象添加到特定位置时,我想保持相同的方法。为什么说它不优雅?
标签: c++ list constructor