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
나는 왜 이것을 할 수 없는지 이해하지 못한다. 누구나 내가 원하는 것을 달성하는 이유와 방법을 이해하도록 도울 수 있습니까?
답변
static
메소드 정의에서 키워드를 제거하십시오 . 클래스 정의에 그대로 유지하십시오.
static
.cpp 파일에 배치 된 키워드는 특정 함수에 정적 링크가 있음을 의미합니다. 동일한 파일의 다른 기능에서만 액세스 할 수 있습니다.
답변
키워드 static
와 virtual
정의에 반복되어서는 안된다. 클래스 선언에서만 사용해야합니다.
답변
static
함수 정의 가 필요하지 않습니다
답변
정적 멤버 함수는 해당 클래스의 정적 변수를 참조해야합니다. 당신의 경우에는
static void CP_StringToPString( std::string& inString, unsigned char *outString);
당신의 멤버 함수 때문에 CP_StringToPstring
정적은 그 함수의 매개 변수 inString
와는 outString
너무 정적으로 선언해야합니다.
정적 멤버 함수는 작업중 인 객체를 참조하지 않지만 선언 된 변수는 현재 객체를 참조하므로 오류를 반환합니다.
멤버 함수에서 정적을 제거하거나 멤버 함수에 사용한 매개 변수를 정적으로 선언하면서 정적을 추가 할 수 있습니다.