-1

出于某种原因,以下代码在 DevC++ 中给出了编译器错误: [错误] 无法声明成员函数 'static double* Sort::bubbleSort(double*, int)' 具有静态链接 [-fpermissive]

冒泡排序.cpp:

#include <iostream>
#include "Sort.h"

int main(int argc, char** argv) {

    double list[] = {4.0, 4.5, 3.2, 10.3, 2.1, 1.6, 8.3, 3.4, 2.1, 20.1};
    int size = 10;
    double* sortedList = Sort::bubbleSort(list, size);

    return 0;
}

排序.h:

class Sort
{
    public: 
        static double* bubbleSort (double list[], int size);    
}
;

排序.cpp:

#include "Sort.h"
#include <algorithm> // std::swap

static double* Sort::bubbleSort (double list[], int size)
{
    bool changed = true;

    do
    {
        changed = false;
        for (int j = 0;  j < size - 1; j++)
        {
            if (list[j] > list[j +1])
            {
                std::swap(list[j], list[j + 1]);
                changed = true;
            }
        }
    } 
    while (changed);

    return list; // return pointer to list array    
}

本质上,我试图在不创建 Sort 对象的情况下调用 bubbleSort 函数。如果我先创建一个对象,代码就可以正常工作。

什么可能导致错误?

感谢您的任何建议。

4

4 回答 4

4

修饰符在staticSort.h 中,但不在 Sort.cpp 中。

那是因为它在两种情况下意味着两种不同的东西。

在类声明中使用时,static表示它引用的方法是类方法(应该在没有对象引用的情况下使用),而不是实例方法(需要对象引用才能调用)。

在实现文件内部(即在类声明之外)使用时,它表明它所引用的方法应该具有静态链接,这意味着它不应该从包含它的目标文件外部可见。从面向对象的角度来看,这些函数对于包含它们的文件是私有的。很明显,如果其他文件(正在使用您的类)应该访问该方法,这将无法工作。

于 2013-11-04T00:45:36.700 回答
0

删除 .cpp 文件中的 static 关键字。此外,您不需要返回指针list,因为只有数组的内容会发生变化,而不是数组本身。您可以继续使用放入函数的指针。将指向与main 函数末尾sortedList相同的内存位置。list

于 2013-11-04T00:45:23.973 回答
0

如果你的Sort类中只有这个静态成员,那么绝对不需要类。

double* bubbleSort (double list[], int size)
{
    bool changed = true;

    do
    {
        changed = false;
        for (int j = 0;  j < size - 1; j++)
        {
            if (list[j] > list[j +1])
            {
                std::swap(list[j], list[j + 1]);
                changed = true;
            }
        }
    } 
    while (changed);

    return list; // return pointer to list array    
}

此外,无需返回指向列表的指针,因为您在对列表进行排序时正在修改列表(double list[]与 相同double* list,并且由于您正在更改例程中的值,指向第一个元素的指针仍将是相同,但数组中的值将被交换)。

void bubbleSort (double list[], int size)
{
    bool changed = true;

    do
    {
        changed = false;
        for (int j = 0;  j < size - 1; j++)
        {
            if (list[j] > list[j +1])
            {
                std::swap(list[j], list[j + 1]);
                changed = true;
            }
        }
    } 
    while (changed);
}
于 2013-11-04T00:47:46.913 回答
0

您应该使函数独立,如果您需要类方法,请使用正确的参数使其调用独立函数。

于 2013-11-04T01:12:38.513 回答