无效的new-expression抽象类类型错误

时间:2015-04-09 20:00:18

标签: c++ sorting

家庭作业
我的合并排序功能出现了这种类型的错误。我认为该错误与我的merge()方法有关,但我认为我在MergeSort()中使用它来处理它。任何帮助将不胜感激。

Sort.h

#ifndef SORT_H_
#define SORT_H_

class Sort {
protected:
   unsigned long num_cmps; // number of comparisons performed in sort function
public:
   virtual void sort(int A[], int size)= 0;    // main entry point
   bool testIfSorted(int A[], int size);        // returns false if not sorted
                                            // true otherwise
   unsigned long getNumCmps() { return num_cmps; }        // returns # of comparisons
   void resetNumCmps() { num_cmps = 0; }
};

class MergeSort:public Sort {       // MergeSort class
public:
  void sort(int A[], int size, int low, int high);      // main entry point
};

#endif


Sort.cpp

 Sort* s;
   switch(op.getAlg()) 
      {
      case 'S':
         s=new SelectionSort();
         break;
      case 'I':
         s=new InsertionSort();
         break;
      case 'B':
         s=new BubbleSort();
         break;
      case 'H':
         s=new HeapSort();
         break;
      case 'R':
         s=new RadixSort();
         radixsortQ = true;
         break;
      case 'M':
         s=new MergeSort(); --> error
         break;
      }


合并Sort.cpp

#include <iostream>
#include "Sort.h"
using namespace std;
void MergeSort::sort(int A[], int size, int low, int high)          // main entry point
{
    if (low < high){
        int middle = (low + high) / 2;
        MergeSort(A, size, low, middle);
        MergeSort(A, size, middle+1, high);
        merge(A, size, low, middle, high);
    }
}

void merge::sort(int A[], int size, int low, int middle, int high){
    int temp[size];
    for(int i = low; i <= high; i++){
        temp[i] = A[i];
    }
    int i = low;
    int j = middle + 1;
    int k = low;

    while(i <= middle && j <= high){
        if(temp[i] <= temp[j]){
            A[k] = temp[i];
            ++i;
        }
        else {
            A[k] = temp[j];
            ++j;
        }
        ++k;
    }
    while(i <= middle){
        A[k] = temp[i];
        ++k;
        ++i;
    }
}

3 个答案:

答案 0 :(得分:3)

您实际上并没有覆盖sort函数,因此MergeSort仍然是一个抽象类:

Sort::sort(int A[], int size)= 0;
MergeSort::sort(int A[], int size, int low, int high);      // main entry point

这些种类有不同的签名,因此它们是不同的功能。

要解决此问题,您需要更改MergeSort :: sort方法,以便不接受lowhigh参数,或添加low和{{1}你的其他排序方法的参数。

答案 1 :(得分:1)

您无法获得虚拟类MergeSort,因为函数的排序具有不同数量的参数

virtual void Sort::sort(int A[], int size) = 0;

        void MergeSort::sort(int A[], int size, int low, int high);

 will be error  s=new MergeSort();

答案 2 :(得分:0)

Sort::sort需要被覆盖。为了覆盖虚函数,您需要在具有相同参数类型的派生类中声明具有相同名称的函数。如果添加额外参数,则不会覆盖虚函数在基类中了。所以MergeSort仍然是一个抽象类,因为它没有覆盖Sort中的纯虚函数。

你必须像这样声明MergeSort::sort

void sort(int A[], int size); // although you can change the parameter names

然后让它委托给另一个以lowhigh为参数的函数(可能应该是私有的)。