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 ++では許可されていません。
フェズベス

10
@Fezvez:または、に置き換え/* static */ます。.hファイルと.cppファイルで同じ修飾子とデフォルト引数を使用するのが好きです。
David Thornley、

2
TL; DR:staticヘッダーファイルに保持します.h。これは、「オブジェクトではなくクラスに添付されている」ことを意味staticし、.cppファイルから削除します。ここでは、別の意味を持たせます。
ステフェイン・グーリッホン

回答:


228

staticメソッド定義のキーワードを削除します。あなたのクラス定義でそれを保ってください。

static.cppファイルに配置されたキーワードは、特定の関数に静的リンケージがあることを意味します。同じファイル内の他の関数からのみアクセスできます。


1
ああ、staticわかったので、メソッド定義では、そのクラス内の他のメソッドのみがその静的メソッドにアクセスでき、そのクラス外の他のメソッドはアクセスできません。
ABV

14
他のクラスメソッドではなく、.cppファイル内の他の関数。とにかく、これをC ++で行うべきではありません。C ++関数に内部リンケージを持たせたい場合は、匿名の名前空間に配置することを検討してください。使用法staticの.cppファイルには、ちょうどC.との下位互換性のためである
x13n

1
好奇心のために...静的クラスメンバーをクラス(.hファイル)で直接定義すると、静的リンケージをどのように使用できますか?
ランブリック2013年

できません。また、プログラムをリンクすると、未解決の外部が表示されるため、そうしても意味がありません。
x13n 2013年

41

キーワードstaticvirtual定義で繰り返されるべきではありません。これらはクラス宣言でのみ使用する必要があります。



-3

静的メンバー関数は、そのクラスの静的変数を参照する必要があります。だからあなたの場合、

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

あなたのメンバ関数のでCP_StringToPstring、その関数のパラメータ静的であり、inStringそしてoutStringあまりにもstaticとして宣言されなければなりません。

静的メンバー関数は、処理中のオブジェクトを参照しませんが、宣言した変数は現在のオブジェクトを参照するため、エラーが返されます。

メンバー関数から静的を削除するか、メンバー関数に使用したパラメーターを静的として宣言しながら静的を追加することもできます。


2
inStringとoutStringは静的関数の引数です。彼らはクラスのメンバーではありません。それらを静的に変換する必要はありません。
999k 2014

それはまったく正しくありません。非静的引数を静的メンバー関数に配置できます。ただし、クラスメンバーの場合は、関数内の静的なものにのみアクセス/変更できます。
Zachary Kraus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.