家庭作业
我的合并排序功能出现了这种类型的错误。我认为该错误与我的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;
}
}
答案 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方法,以便不接受low
和high
参数,或添加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
然后让它委托给另一个以low
和high
为参数的函数(可能应该是私有的)。