2013-11-04 74 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

您應該使該函數獨立,如果您需要類方法,請使用正確的參數調用獨立函數。