我有不同的类,我想用这些类中的对象制作一个向量并按值对其进行排序

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,它们应该返回相同的类型(intdouble 不是协变的)。 【参考方案1】:

这里的问题是你有一个指针的向量。因此,std::sort 所做的比较是使用 指针 完成的,而不是它们所指向的结构。

要使其工作,您必须提供一个全局 operator&lt; 函数,该函数接受两个指针作为参数。或者你提供一个比较函数作为std::sort 的第三个参数。两者都需要取消引用指针。

此外,您仍然需要将您的函数标记为 virtual 才能使多态性起作用。

【讨论】:

以上是关于我有不同的类,我想用这些类中的对象制作一个向量并按值对其进行排序的主要内容,如果未能解决你的问题,请参考以下文章

我应该在哪里存储对象列表?

有没有办法将两个或多个不同的类链接到一个类中(然后在向量上使用)?

如何创建从同一类继承的不同对象的向量?

从向量中保存的类对象输出类函数

如何设置一个按钮以显示弹出窗口的不同结果? (JavaFX)

在同一个向量中存储两个不同的类(具有相同的继承基类)? (没有提升)