2011-05-12 1 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

+0

오류는 무엇입니까? –

+9

@Fezvez : 다른 방법으로는'/ * static * /'으로 바꾸십시오. .h 및 .cpp 파일에 동일한 수정 자 및 기본 인수가있는 것이 좋습니다. –

답변

179

메서드 정의에서 static 키워드를 제거하십시오. 클래스 정의에 그대로 두십시오.

static 키워드는 .cpp 파일에 배치되어 특정 함수에 정적 연결이 있음을 의미합니다. 동일한 파일의 다른 기능에서만 액세스 할 수 있습니다.

+1

아아, 메서드 정의에서 '정적'이라고하면 해당 클래스의 다른 메서드 만 해당 정적 메서드에 액세스 할 수 있고 그 클래스 외부의 다른 메서드는 사용할 수 없다는 것을 의미합니다. – ABV

+12

다른 클래스 메서드는 아니지만 .cpp 파일의 다른 함수입니다. 어쨌든 C++에서는 이것을해서는 안됩니다. C++ 함수가 내부 연결을 원하면 익명의 네임 스페이스에 배치하는 것을 고려해야합니다. .cpp 파일에서'static '을 사용하는 것은 C와의 하위 호환을 위해서만 사용됩니다. – x13n

+1

호기심을 위해서 ... 정적 클래스 멤버를 클래스 (.h 파일)에 직접 정의하면 정적 연결을 어떻게 사용할 수 있습니까? – lumbric

32

키워드 staticvirtual이 정의에 반복되어서는 안 함수 정의에 static을 가질 필요가 없습니다. 클래스 선언에만 사용해야합니다.

-3

정적 멤버 함수는 해당 클래스의 정적 변수를 참조해야합니다. 당신의 멤버 함수 CP_StringToPstring 정적이기 때문에

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

, 귀하의 경우 그래서, 그 함수에서 매개 변수는 inStringoutString 너무 정적으로 선언해야합니다.

정적 멤버 함수는 작업중인 개체를 참조하지 않지만 선언 한 변수가 현재 개체를 참조하므로 오류가 반환됩니다.

구성원 함수에서 정적을 제거하거나 정적을 추가 할 수 있으며 멤버 함수에 사용한 매개 변수도 정적으로 선언 할 수 있습니다.

+1

inString 및 outString은 정적 함수의 인수입니다. 그들은 반원이 아니다. 정적으로 변환 할 필요가 없습니다. – 999k

+0

그것은 정확하지 않습니다. 정적 멤버 함수에 정적이 아닌 인수를 배치 할 수 있습니다.그러나 클래스 멤버의 경우 함수에서 정적 멤버 만 액세스하거나 수정할 수 있습니다. –