我再次发现自己在C++中执行一些非常简单的任务时失败了。有时候我希望我能从Java中的OO中了解我所知道的所有知识,因为我的问题通常从思考Java开始。我想要排序的std::list<BaseObject*>
。比方说,BaseObject
是:对指针列表进行排序
class BaseObject {
protected:
int id;
public:
BaseObject(int i) : id(i) {};
virtual ~BaseObject() {};
};
我可以用一个比较结构指针列表排序,以BaseObject
:
struct Comparator {
bool operator()(const BaseObject* o1, const BaseObject* o2) const {
return o1->id < o2->id;
}
};
它应该是这样的:
std::list<BaseObject*> mylist;
mylist.push_back(new BaseObject(1));
mylist.push_back(new BaseObject(2));
// ...
mylist.sort(Comparator());
// intentionally omitted deletes and exception handling
直到这里,一切都是好的。不过,我介绍了一些派生类:
class Child : public BaseObject {
protected:
int var;
public:
Child(int id1, int n) : BaseObject(id1), var(n) {};
virtual ~Child() {};
};
class GrandChild : public Child {
public:
GrandChild(int id1, int n) : Child(id1,n) {};
virtual ~GrandChild() {};
};
所以现在我想整理下以下规则:
- 对于任何
Child
对象c
和BaseObject
b
,b<c
- 比较
BaseObject
对象,像以前一样使用其id
s。 - 要比较
Child
的对象,请比较它的var
s。如果它们相同,则回退到规则2. GrandChild
对象应回退到Child
行为(规则3)。
我最初认为我可以在Comparator
中做一些演员。然而,这抛弃了常量。然后,我想我可能会比较typeid
,但随后一切都显得杂乱无章,甚至不正确。
我该如何执行这种操作,仍然使用list<BaseObject*>::sort
?
谢谢
'dynamic_cast'? – kennytm 2010-03-31 15:55:55
我的理解是否正确?首先,B
Dan
2010-03-31 22:02:46