我试图创建一个程序来跟踪排序进行比较的次数,但我不确定如何将变量传递给基类和从子类传递到子类。现在我得到一个错误说"错误:传递' const childsort'作为'这个'参数' void AbstractSort :: setConversions(int)'抛弃限定符[-fpermissive] |"
我有几个问题。使用子类是否继承了父类中的函数的目的是什么?如果是这样,我如何通过子类访问基类中的转换变量?如果没有,我是否需要子类中的局部变量和本地函数来计算转换?
#include <iostream>
using namespace std;
class AbstractSort
{
protected :
int conversions;
public :
AbstractSort(){};
void setConversions(int c)
{ conversions = c; }
int getConversions() const
{ return conversions; }
int addConversions()
{ return conversions++; }
virtual void sort(int arr[], int size) const = 0;
};
class childsort : public AbstractSort
{
public :
childsort() : AbstractSort(){}
virtual void sort(int arr[], int size) const
{
int x = 0, y = 0, c = 0;
for(x = 0; x < size - 1; ++x)
{
for(y = 0; y < size - x - 1; ++y)
{
if(arr[y] > arr[y + 1])
{
int temp = arr[y];
arr[y] = arr[y + 1];
arr[y + 1] = temp;
}
setConversions(c++);
}
}
}
};
答案 0 :(得分:1)
问:使用子类的目的不是继承父类的函数吗?
<答:是的,是的。基类中的方法必须是“公共”或“受保护”。此外,子类可以override或hide对应的基类方法。在您的情况下,问题是一个简单的拼写错误:setConversions()
vs setConversion()
。
===========================================
附录:你修正了拼写错误,然后你得到了这个(新的!)错误:
“const childsort为'''的'''参数 AbstractSort :: setConversions(int)'丢弃限定符......“
这是因为sort() .. const
和setConversions()
之间存在冲突。
看这里(类似的情况):
error: passing xxx as 'this' argument of xxx discards qualifiers
。所以当你尝试用const对象调用[your method]编译器时 检测到一个问题,即你正在调用一个非const成员函数 在const对象上,因为非const成员是不允许的 函数不承诺不修改对象;所以编译器是 打算安全地假设[你的方法]可能试图修改 对象,但同时,它也注意到对象是 常量;所以任何修改const对象的尝试都应该是一个错误。 因此编译器会生成错误消息。
答案 1 :(得分:-1)
您的编译错误是由
引起的virtual void sort(int arr[], int size) const
是一个const
方法,它调用非const setConversions()
方法。
const
方法只能调用其他const
方法,无论是在自己的类中还是在超类中。此外,const
方法无法修改任何非mutable
类成员。