2011-05-12 138 views
106
我有一個小麻煩在C靜態方法++

靜態方法

例.H工作

class IC_Utility { 
public: 
    IC_Utility(); 
    ~IC_Utility(); 

    std::string CP_PStringToString(const unsigned char *outString); 
    void CP_StringToPString(std::string& inString, unsigned char *outString, short inMaxLength); 
    static void CP_StringToPString(std::string& inString, unsigned char *outString); 
    void CP_StringToPString(FxString& inString, FxUChar *outString); 

}; 

實例的.cpp:

static void IC_Utility::CP_StringToPString(std::string& inString, unsigned char *outString) 
{ 
    short  length = inString.length(); 

    if(outString != NULL) 
    { 
     if(length >= 1) 
      CPLAT::CP_Utility::CP_CopyMemory(inString.c_str(), &outString[ 1 ], length); 

      outString[ 0 ] = length; 
    } 
} 

我想做一個請撥打電話:

IC_Utility::CP_StringToPString(directoryNameString, directoryName); 

但我收到一個錯誤:

error: cannot declare member function 'static void IC_Utility::CP_StringToPString(std::string&, unsigned char*)' to have static linkage 

我不明白爲什麼我不能這樣做。任何人都可以幫助我理解爲什麼以及如何實現我想要的?

+2

首先,您應該刪除.cpp文件中的'static'關鍵字。 C++不允許它。 – Fezvez 2011-05-12 15:36:36

+0

錯誤是什麼? – 2011-05-12 15:37:19

+9

@Fezvez:或者用'/ * static * /'替換它。我喜歡在.h和.cpp文件中使用相同的修飾符和默認參數。 – 2011-05-12 15:40:18

回答

179

刪除方法定義中的static關鍵字。保持它在你的類定義。

static置於.cpp文件中的關鍵字表示某個函數具有靜態鏈接,即。它只能從同一文件中的其他功能訪問。

+1

啊,明白了,所以方法定義中的'static'意味着只有該類中的其他方法才能訪問該靜態方法,而不是該類之外的其他方法。 – ABV 2011-05-12 15:42:17

+12

不是其他類方法,而是.cpp文件中的其他函數。無論如何,你不應該在C++中這樣做。如果您希望C++函數具有內部鏈接,則應考慮將其放置在某個匿名名稱空間中。在.cpp文件中使用'static'只是爲了與C向後兼容。 – x13n 2011-05-12 15:46:08

+1

只是爲了好奇...如果我在類中(在.h文件中)直接定義一個靜態類成員,我該如何使用靜態鏈接? – lumbric 2013-10-08 09:35:54

9

你並不需要有static在函數定義

32

關鍵詞staticvirtual不應該在定義中重複。它們只應用於類聲明中。

-3

靜態成員函數必須引用該類的靜態變量。所以你的情況,

static void CP_StringToPString(std::string& inString, unsigned char *outString); 

因爲你的成員函數CP_StringToPstring是靜態的,在該函數的參數,inStringoutString也應該被聲明爲靜態的。

靜態成員函數沒有引用它正在處理的對象,而是你聲明的變量引用了它的當前對象,所以它返回錯誤。

您可以從成員函數中刪除靜態或添加靜態,同時將用於成員函數的參數聲明爲靜態。

+1

inString和outString是靜態函數的參數。他們不是班級成員。沒有必要將它們轉換爲靜態。 – 999k 2014-12-09 11:08:24

+0

這是不正確的。您可以將非靜態參數放置在靜態成員函數中。但是對於類成員,您只能訪問/修改函數中的靜態元素。 – 2015-03-23 04:12:27