嗨,我已经分配了任何类型分数排序数组(升序或降序),但当我调用函数doSomething时,它是错误的。
template <class T>
struct Fraction {
T num, denom; //num - Numerator ; demon-Denominator
};
template <class T>
void AscendingArrayFraction(Fraction<T> a[], int n)
{
for (int i = 0;i < n;i++) {
for (int j = i + 1;j < n;j++) {
if (compareFraction(a[i], a[j]))
swapFraction(a[i], a[j]);
}
}
}
template <class T>
void DescendingArrayFraction(Fraction<T> a[], int n)
{
for (int i = 0;i < n;i++) {
for (int j = i + 1;j < n;j++) {
if (!compareFraction(a[i], a[j]))
swapFraction(a[i], a[j]);
}
}
}
template <class T>
void doSomething(Fraction<T> a[], int n, T(*p) (Fraction<T>, int)) {
return p(a,n);
}
int main()
{
Fraction<int> a[100];
int n;
inputFraction(a, n);
doSomething(a, n, AscendingArrayFraction(a,n)); // It's have a problem right here
}
看来我还是不明白这一课(抽象)。 你能帮我修复功能吗??
在我看来,您似乎对函数指针(doSomething
中的p
)的使用感到困惑。 通常,在排序算法中使用函数指针时,函数指针的作用是比较两个对象。 所以你只有一个排序功能,你可以定制不同的比较功能。 看起来这就是你想要写的东西,但是你把它弄混了。
相反,您有两个排序函数AscendingArrayFraction
和DescendingArrayFraction
,没有比较函数(CompareFraction
在任何地方都没有定义),还有一个名为DoSomething
的函数,其用途不明确。
这是代码应该看起来的样子
// true if a < b, false otherwise
template <class T>
bool compareFractionsAscending(Fraction<T> a, Fraction<T> b) {
...
}
// true if a > b, false otherwise
template <class T>
bool compareFractionsDescending(Fraction<T> a, Fraction<T> b) {
...
}
// sort array using compareFractions function pointer
template <class T>
void sortFractions(Fraction<T> a[], int n, bool (*compareFractions)(Fraction<T>, Fraction<T>)) {
...
}
int main()
{
Fraction<int> a[100];
int n;
inputFraction(a, n);
sortFractions(a, n, compareFractionsAscending<int>);
}