กำหนดวิธีการคงที่ในไฟล์ต้นฉบับด้วยการประกาศในส่วนหัวของไฟล์ใน 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

คำตอบ:


228

ลบstaticคำหลักในการกำหนดวิธีการ เก็บไว้ในคำจำกัดความของคลาส

staticคำสำคัญอยู่ในไฟล์. cpp หมายความว่าฟังก์ชั่นบางอย่างมีการเชื่อมโยงแบบคงที่เช่น มันสามารถเข้าถึงได้จากฟังก์ชั่นอื่น ๆ ในไฟล์เดียวกันเท่านั้น


1
อ่าเข้าใจแล้วstaticในนิยามของเมธอดจะหมายถึงเฉพาะวิธีอื่นในคลาสนั้นเท่านั้นที่สามารถเข้าถึงวิธีสแตติกได้ไม่มีวิธีอื่นนอกเหนือจากคลาสนั้น
ABV

14
ไม่ใช่วิธีการเรียนอื่น ๆ แต่ฟังก์ชั่นอื่น ๆ ในไฟล์. cpp คุณไม่ควรทำเช่นนี้ใน C ++ หากคุณต้องการให้ฟังก์ชัน C ++ มีการเชื่อมโยงภายในคุณควรพิจารณาวางในเนมสเปซที่ไม่ระบุชื่อ การใช้staticไฟล์. cpp เป็นเพียงความเข้ากันได้แบบย้อนหลังกับ C.
x13n

1
แค่อยากรู้อยากเห็น ... ถ้าฉันกำหนดสมาชิกคลาสคงที่โดยตรงในชั้นเรียน (ในไฟล์. h) ฉันจะใช้การเชื่อมโยงแบบคงที่ได้อย่างไร
lumbric

คุณทำไม่ได้ และมันก็ไม่มีเหตุผลที่จะทำเช่นนั้นเนื่องจากการเชื่อมโยงโปรแกรมเข้าด้วยกันจะทำให้บุคคลภายนอกที่ไม่ได้รับการแก้ไขปรากฏ
x13n



-3

ฟังก์ชันสมาชิกแบบสแตติกต้องอ้างถึงตัวแปรสแตติกของคลาสนั้น ดังนั้นในกรณีของคุณ

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

เนื่องจากฟังก์ชันสมาชิกของคุณCP_StringToPstringเป็นแบบคงที่พารามิเตอร์ในฟังก์ชันนั้นinStringและoutStringควรถูกประกาศว่าเป็นแบบคงที่เช่นกัน

ฟังก์ชั่นสมาชิกคงที่ไม่ได้อ้างถึงวัตถุที่มันกำลังทำงานอยู่ แต่ตัวแปรที่คุณประกาศอ้างถึงวัตถุปัจจุบันของมันดังนั้นมันกลับข้อผิดพลาด

คุณสามารถลบสแตติกออกจากฟังก์ชั่นสมาชิกหรือเพิ่มสแตติกได้ในขณะที่ประกาศพารามิเตอร์ที่คุณใช้สำหรับฟังก์ชั่นสมาชิกเป็นสแตติกด้วย


2
inString และ outString เป็นข้อโต้แย้งของฟังก์ชั่นแบบคงที่ พวกเขาไม่ใช่สมาชิกชั้นเรียน ไม่จำเป็นต้องแปลงให้เป็นแบบคงที่
999k

นั่นไม่ถูกต้องเลย คุณสามารถวางอาร์กิวเมนต์ที่ไม่คงที่ในฟังก์ชั่นสมาชิกคงที่ แต่สำหรับสมาชิกคลาสคุณสามารถเข้าถึง / แก้ไขสแตติกได้ในฟังก์ชันเท่านั้น
Zachary Kraus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.