Definisikan metode statis dalam file sumber dengan deklarasi dalam file header dalam C ++


142

Saya mengalami sedikit kesulitan bekerja dengan metode statis di C ++

Contoh .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);

};

Contoh .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;
    }
}

Saya ingin menelepon seperti:

IC_Utility::CP_StringToPString(directoryNameString, directoryName );

Tapi saya mendapat kesalahan:

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

Saya tidak mengerti mengapa saya tidak bisa melakukan ini. Adakah yang bisa membantu saya memahami mengapa dan bagaimana mencapai apa yang saya inginkan?


2
Pertama-tama, Anda harus menghapus statickata kunci dalam file .cpp. C ++ tidak mengizinkannya.
Fezvez

10
@Fezvez: Sebagai gantinya, ganti dengan /* static */. Saya suka memiliki pengubah dan argumen default yang sama dalam file .h dan .cpp.
David Thornley

2
TL; DR: Simpan staticdi file header .h, itu berarti "terlampir ke kelas, bukan ke objek apa pun", hapus staticdi .cppfile, itu memiliki arti berbeda yang tidak Anda inginkan di sini.
Stéphane Gourichon

Jawaban:


228

Hapus statickata kunci dalam definisi metode. Simpan saja dalam definisi kelas Anda.

statickata kunci ditempatkan dalam file .cpp berarti bahwa fungsi tertentu memiliki hubungan statis, yaitu. itu hanya dapat diakses dari fungsi lain dalam file yang sama.


1
Ah, mengerti begitu staticdalam definisi metode berarti hanya metode lain di kelas yang dapat mengakses metode statis, tidak ada metode lain di luar kelas itu.
ABV

14
Bukan metode kelas lain, tetapi fungsi lain dalam file .cpp. Anda seharusnya tidak melakukan ini di C ++. Jika Anda ingin fungsi C ++ memiliki tautan internal, Anda harus mempertimbangkan untuk menempatkannya di beberapa namespace anonim. Penggunaan staticfile .cpp hanya untuk kompatibilitas dengan C.
x13n

1
Hanya untuk rasa ingin tahu ... Jika saya mendefinisikan anggota kelas statis langsung di kelas (dalam file .h), bagaimana saya bisa menggunakan tautan statis?
lumbric

Kamu tidak bisa Dan tidak masuk akal untuk melakukannya, karena menghubungkan program bersama-sama akan menyebabkan eksternal yang belum terselesaikan muncul.
x13n

41

Kata kunci staticdan virtualtidak boleh diulang dalam definisi. Mereka seharusnya hanya digunakan dalam deklarasi kelas.


11

Anda tidak perlu memiliki staticdefinisi fungsi


-3

Fungsi anggota statis harus merujuk ke variabel statis kelas itu. Jadi dalam kasus Anda,

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

Karena fungsi anggota Anda CP_StringToPstringstatis, parameter dalam fungsi itu, inStringdan outStringharus dinyatakan sebagai statis juga.

Fungsi anggota statis tidak merujuk ke objek yang sedang dikerjakannya tetapi variabel yang Anda deklarasikan merujuk ke objek saat ini sehingga mengembalikan kesalahan.

Anda bisa menghapus statis dari fungsi anggota atau menambahkan statis sambil mendeklarasikan parameter yang Anda gunakan untuk fungsi anggota sebagai statis juga.


2
inString dan outString adalah argumen fungsi statis. Mereka bukan anggota kelas. Tidak perlu mengubahnya menjadi statis.
999k

Itu tidak benar sama sekali. Anda dapat menempatkan argumen non-statis dalam fungsi anggota statis. Tetapi dari anggota kelas, Anda hanya dapat mengakses / memodifikasi yang statis di fungsi.
Zachary Kraus
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.