C ++에서 헤더 파일에 선언하여 소스 파일에 정적 메소드 정의


142

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
우선 static, .cpp 파일에서 키워드를 제거해야 합니다. C ++에서는 허용하지 않습니다.
Fezvez

10
@Fezvez : 또는로 교체하십시오 /* static */. .h 및 .cpp 파일에 동일한 수정 자와 기본 인수를 사용하는 것이 좋습니다.
David Thornley

2
TL; DR : static헤더 파일에 보관하십시오. .h"객체가 아닌 클래스에 연결됨"을 의미 static하고 .cpp파일 에서 제거 하십시오. 여기서 원하지 않는 다른 의미가 있습니다.
Stéphane Gourichon 21

답변:


228

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

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


1
아, static메소드 정의에서 그렇게 하면 해당 클래스의 다른 메소드 만 해당 정적 메소드에 액세스 할 수 있으며 해당 클래스 외부의 다른 메소드는 액세스 할 수 없습니다.
ABV

14
다른 클래스 메서드는 아니지만 .cpp 파일의 다른 함수입니다. 어쨌든 C ++ 에서이 작업을 수행해서는 안됩니다. C ++ 함수가 내부 연결을 갖도록하려면 익명 네임 스페이스에 배치하는 것이 좋습니다. static.cpp 파일에서의 사용법은 C와의 하위 호환성을위한 것입니다.
x13n

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

당신은 할 수 없습니다. 프로그램을 서로 연결하면 해결되지 않은 외부 장치가 나타날 수 있으므로 그렇게하는 것은 의미가 없습니다.
x13n

41

키워드 staticvirtual정의에 반복되어서는 안된다. 클래스 선언에서만 사용해야합니다.


11

static함수 정의 가 필요하지 않습니다


-3

정적 멤버 함수는 해당 클래스의 정적 변수를 참조해야합니다. 당신의 경우에는

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

당신의 멤버 함수 때문에 CP_StringToPstring정적은 그 함수의 매개 변수 inString와는 outString너무 정적으로 선언해야합니다.

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

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


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

그것은 전혀 정확하지 않습니다. 정적 멤버 함수에 정적이 아닌 인수를 배치 할 수 있습니다. 그러나 클래스 멤버의 경우 함수의 정적 멤버에만 액세스 / 수정할 수 있습니다.
Zachary Kraus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.