我有不同的类,我想用这些类中的对象制作一个向量并按值对其进行排序
Posted
技术标签:
【中文标题】我有不同的类,我想用这些类中的对象制作一个向量并按值对其进行排序【英文标题】:I have different classes and I want to make a vector with objects from those classes and sort it by a value 【发布时间】:2017-11-24 12:14:11 【问题描述】:我有第一节课。
class Class1
public:
Class1();
double getVal();
bool operator<(Class1& A) return getVal() > A.getVal();
virtual ~Class1();
从这个类中我派生出两个类。
class Class2 : virtual public Class1
protected:
int val1;
public:
int getVal() return val;
bool operator<(Class1& A) return getVal() > A.getVal();
还有第二节课。
class Class3 : virtual public Class1
protected:
double val2;
public:
double getVal() return val;
bool operator<(Class1& A) return getVal() > A.getVal();
最后,我从这些类中派生出一个类。
class Class4 : public Class2, public Class3
protected:
char* info;
public:
double getVal() return val1+val2;
bool operator<(Class1& A) return getVal() > A.getVal();
我主要有:
void main()
vector<Class1*> vec;
vec.push_back(new Class2(3));
vec.push_back(new Class3(5));
vec.push_back(new Class4(2));
sort(vec.begin(),vec.end());
代码很好地将向量中的对象推回,但是当我尝试对其进行排序时,什么也没有发生。 我怀疑父类(Class1)和主要是getVal()方法有问题,但我不知道该怎么办。 问题是:如何对这个向量进行排序?
【问题讨论】:
但是当我试图对其进行排序时,什么都没有发生 -- 事情正在发生。std::sort
正在做你写的事情,就是对指针值进行排序。
您的方法可以是const
(并采用 const 引用)。
它是否打算在派生类中隐藏getVal()
?使用其他名称似乎更好。 (或者如果你想要虚拟 getter,它们应该返回相同的类型(int
和 double
不是协变的)。
【参考方案1】:
这里的问题是你有一个指针的向量。因此,std::sort
所做的比较是使用 指针 完成的,而不是它们所指向的结构。
要使其工作,您必须提供一个全局 operator<
函数,该函数接受两个指针作为参数。或者你提供一个比较函数作为std::sort
的第三个参数。两者都需要取消引用指针。
此外,您仍然需要将您的函数标记为 virtual
才能使多态性起作用。
【讨论】:
以上是关于我有不同的类,我想用这些类中的对象制作一个向量并按值对其进行排序的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法将两个或多个不同的类链接到一个类中(然后在向量上使用)?