Kaynak dosyadaki statik yöntemi C ++ 'da başlık dosyasında bildirimle tanımlayın


142

C ++ statik yöntemlerle çalışırken biraz sorun yaşıyorum

Örnek .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);

};

Örnek .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;
    }
}

Şunun gibi bir arama yapmak istedim:

IC_Utility::CP_StringToPString(directoryNameString, directoryName );

Ama bir hata alıyorum:

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

Bunu neden yapamadığımı anlamıyorum. İstediğimi neden ve nasıl başaracağımı anlamama yardımcı olan var mı?


2
Her şeyden önce, static.cpp dosyasındaki anahtar kelimeyi kaldırmalısınız . C ++ buna izin vermez.
Fezvez

10
@Fezvez: Alternatif olarak, yerine koyun /* static */. .H ve .cpp dosyalarında aynı değiştiricilere ve varsayılan bağımsız değişkenlere sahip olmayı seviyorum.
David Thornley

2
TL; DR: staticBaşlık dosyasında saklayın , .h"sınıfa bağlı, herhangi bir nesneye değil", dosyada kaldırın static, .cppburada istemediğiniz farklı bir anlamı vardır.
Stéphane Gourichon

Yanıtlar:


228

staticYöntem tanımındaki anahtar kelimeyi kaldırın . Sadece sınıf tanımınızda saklayın.

static.cpp dosyasına yerleştirilen anahtar kelime, belirli bir işlevin statik bir bağlantıya sahip olduğu anlamına gelir. yalnızca aynı dosyadaki diğer işlevlerden erişilebilir.


1
Ah, staticbu yöntem tanımında sadece bu sınıftaki diğer yöntemlerin o statik yönteme erişebileceği anlamına gelir, o sınıfın dışında başka hiçbir yöntem yoktur.
ABV

14
Diğer sınıf yöntemleri değil, .cpp dosyasındaki diğer işlevler. Zaten C ++ bunu yapmamalısınız. C ++ işlevinin iç bağlantıya sahip olmasını istiyorsanız, bazı anonim ad alanına yerleştirmeyi düşünmelisiniz. Kullanım static.cpp dosyaları sadece geriye doğru C ile uyumluluk için olan
x13n

1
Sadece merak için ... Statik bir sınıf üyesini doğrudan sınıfta (.h dosyasında) tanımlarsam, statik bağlantıyı nasıl kullanabilirim?
9'da lumbric

Yapamazsın. Ve bunun bir anlamı yoktur, çünkü programı birbirine bağlamak çözülmemiş hariciların ortaya çıkmasına neden olacaktır.
x13n

41

Anahtar kelimeler staticve virtualtanımda tekrarlanmamalıdır. Yalnızca sınıf bildiriminde kullanılmalıdır.


11

Sen sahip olmak gerekmez staticfonksiyon tanımında


-3

Statik üye işlevleri, o sınıfın statik değişkenlerini belirtmelidir. Yani sizin durumunuzda,

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

Sizin üye işlevi yana CP_StringToPstringstatik, yani işlev parametreleri inStringve outStringçok statik olarak ilan edilmelidir.

Statik üye işlevleri üzerinde çalıştığı nesneye başvurmaz, ancak bildirdiğiniz değişkenler geçerli nesnesine başvurur, bu nedenle hata döndürür.

Üye işlevi için statik parametresini kaldırabilir veya üye işlevi için kullandığınız parametreleri statik olarak bildirirken statik ekleyebilirsiniz.


2
inString ve outString, statik işlevin bağımsız değişkenleridir. Onlar sınıf üyesi değiller. Bunları statik hale dönüştürmeye gerek yoktur.
999k

Bu hiç doğru değil. Statik olmayan bir fonksiyona statik olmayan argümanlar yerleştirebilirsiniz. Ancak sınıf üyelerinin yalnızca işlevdeki statik olanlara erişebilir / bunları değiştirebilirsiniz.
Zachary Kraus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.