【发布时间】:2013-06-22 15:16:54
【问题描述】:
我在从 STL 集继承时遇到问题(我认为):
这是 Prime 类:
class Prime : public set<A> {
private:
// private data members.
public:
// C'tor...
void printParticularA(const int& id);
}
这里是A类:
class A : public List<B>{
private:
// data members.
int id;
public:
// C'tor
A(const A& copy) : List<B>(copy), //copy data members
{ // validate data and throw exceptions if needed. };
bool operator< (const A& rhs) const{
return id < rhs.id;
}
void printReport() const {
for(const B& item : *this){ item.print(); }
}
}
现在问题来了。在下一个函数中,我想打印集合中的特定 A 对象:
void Prime::printParticularA(const int& id) {
find(AFinder(id))->printReport();
}
我也试过这个:
void Prime::printParticularA(const int& id) {
*(find(AFinder(id))).printReport();
}
注意:假设 B 类有 print() 方法。
注意 2:AFinder 是一个仅使用 id 数据制作虚拟 A 对象的类。
问题在于,当“find”找到对象时,它返回 const_iterator(因为 set 中的每个对象都是 const),而当我取消引用它时,我得到了对象的副本 (??) 但里面的 B 列表是空的!
'->' 版本也会出现这种情况。
现在我知道 set 不允许我更改对象,但我不打算更改对象(如您在 printReport 成员函数的声明中所见)。
感谢您对此提供的任何帮助!
编辑:谢谢大家,你们帮了我很多,尤其是学会了不该做的事情。
我解决了这个问题,但它不在集合、列表中,也没有我在这里展示的任何课程。
我的错误在于理解给我的问题(是的,这是我的家庭作业,我还是 C++ 新手)。
抱歉,如果您觉得我浪费了您的时间。
我希望我可以从您的所有经验中学习,并有朝一日帮助他人!
简而言之,谢谢! :)
【问题讨论】:
-
从 STL 容器继承是个坏主意:stackoverflow.com/questions/2034916/…
-
标准容器不是为公共继承而设计的。
-
您确定
find()成功了吗?您应该始终检查返回值,并且只有在它是!= end()时才取消引用它。 -
我确信 find() 成功了。我检查了返回值(尽管上面写了)。 @Anycorn 假设我已经处理了链接中提到的“删除”问题,为什么这段代码不起作用? find() 返回一个 A 对象(肯定),但它的列表是空的。顺便说一句,列表不是 STL,它是我对列表容器的实现。
标签: c++ inheritance stl set dereference