我是c ++的新手,但我已经开始考虑一个特定的任务,需要我在每次尝试更改或读取任何列表项时,都需要添加一个特定的代码块.
生成的列表应该尽可能地表现并且看起来尽可能多地使用std :: list,除了这个小的异常,这使我能够在每次读取/写入该列表时执行特定的任务.
从我到目前为止发现的,我所能想到的是从list :: iterator派生一个类并重载它的operator*和operator =来实现这些特定的任务.
然后我应该从std :: list派生一个类,并通过重载begin()和end()方法使它使用我的新迭代器类型.或者是否有更好的方法使它使用自定义迭代器?
这将处理迭代器访问,但我可以看到列表甚至可以返回指向它的成员的指针.我想我无能为力,并且必须从我的新列表类中删除此功能.
我很感激你对这个问题的看法.
从std :: list派生几乎肯定不是答案.stl中的集合根本不是从中派生出来的,这样做会导致您遇到问题.
典型的例子是析构函数问题.stl集合中的析构函数不是虚拟的.如果通过对std :: list的引用删除对象,这将破坏您在派生类析构函数中放置的任何逻辑.例如
std::list* pList = new YourNewListClass();
delet pList; // runs std::list::~list()
Run Code Online (Sandbox Code Playgroud)
您还需要覆盖迭代器上的方法.它需要改变每个可能改变集合的方法.
一种更稳定的方法是实现自己的std :: list样式类,该类遵循标准的stl容器行为.然后,您可以在您想要事件的地方使用此列表,而不会遇到从std :: list派生的问题.