2013-11-04 78 views
-1

出于某种原因,下面的代码给出DEVC++编译器错误:[错误]不能声明成员函数“静态双*排序::冒泡(双*,INT)”为有静态链接[-fpermissive]静态函数调用不工作(C++)

BubbleSort.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; 
} 

Sort.h:

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

Sort.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  
} 

本质上讲,我试图调用冒泡功能,而无需创建一个排序的对象。如果我先创建一个对象,代码工作正常。

什么可能导致错误?

感谢您的任何建议。

+1

删除原型实现中的静态 – jbh

+0

但是我不需要声明静态函数以便在不创建类的对象的情况下使用它? – navig8tr

+1

“静态”修饰符进入Sort.h中,但不在Sort.cpp中。 –

回答

3

static修改进去Sort.h,但不是在Sort.cpp。

这是因为这意味着在这两个背景下两回事。

在类声明中使用时,static表示它引用的方法是一个类方法(应该使用而不使用对象引用),而不是实例方法(即需要调用对象引用)。

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

+0

很好的解释。谢谢。 – navig8tr

+1

它是一个古怪的保留从C. – FlavorScape

+0

@Giulio Franco:这是否意味着你可以添加静态关键字到私有成员函数而不会导致错误? – maddin45

0

删除.cpp文件中的static关键字。另外,您不需要返回指针list,因为只有数组内容发生更改,而不是数组本身。你可以继续使用你放入函数的指针。 sortedList将指向与主函数结束时的list相同的内存位置。

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); 
} 
+0

感谢您的建议。还有其他成员,但不是很多。我当然可以不用班,但我认为这将是一个好习惯。 – navig8tr

+0

在C++中,如果不必在类中(例如,它不使用任何类成员),则没有理由在类中使用它。对于来自Java和C#等语言的人来说,这是一个艰难的习惯。 –

0

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