【问题标题】:sort a array of elements of any types对任何类型的元素数组进行排序
【发布时间】:2020-06-27 12:35:34
【问题描述】:

您好,我已经分配了任何类型的分数的排序数组(升序或降序) 但是当我调用函数 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吗??

【问题讨论】:

  • 究竟出了什么问题?具体说明预期的输出以及实际得到的输出。
  • 请定义“这是错误的”。

标签: c++ class templates


【解决方案1】:

在我看来,你对函数指针的使用感到困惑(doSomething 中的p)。通常,当您在排序算法中使用函数指针时,函数指针的目的是比较两个对象。因此,您只有一个排序功能,您可以使用不同的比较功能进行自定义。看起来这就是你想要写的,但你把它弄混了。

相反,您有两个排序函数 AscendingArrayFractionDescendingArrayFraction,没有比较函数(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>);
}

【讨论】:

  • 谢谢,我想我明白了
猜你喜欢
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2015-10-18
  • 2016-02-01
  • 1970-01-01
相关资源
最近更新 更多