สร้างวัตถุ String จาก std::string โดย overloading = โอเปอเรเตอร์

ฉันได้ลองหลายตัวเลือกแล้ว แต่คอมไพเลอร์ของฉันไม่รับโอเปอเรเตอร์ที่โอเวอร์โหลดหรือมีอย่างอื่นผิดปกติ ฉันใช้ XCode 4.5.2 กับคอมไพเลอร์ Apple LLVM 4.1 เริ่มต้น

ข้อผิดพลาดที่ฉันได้รับคือ: Assigning to 'cocos2d::CCString *' from incompatible type 'const char [5]'

ในบรรทัดเหล่านี้:

CCString *s_piece__locks = "TEST";
cocos2d::CCString *s_piece__locks2 = "TEST";

รหัส .h ของฉัน:

CCString& operator= (const std::string& str);
//    CCString& operator= (const char* str);  // this doesn't work either
const CCString& operator = (const char *);

รหัส .cpp ของฉัน (แม้ว่าจะไม่เกี่ยวข้องก็ตาม):

CCString& CCString::operator= (const std::string& str)
{
    m_sString = CCString::create(str)->m_sString;
    return *this;
}

const CCString& CCString :: operator = (const char* str)
{
    m_sString = CCString::create(str)->m_sString;
    return *this;
}

ความช่วยเหลือของคุณได้รับการชื่นชมอย่างมาก ขอบคุณ!


person PerfectGamesOnline.com    schedule 10.01.2013    source แหล่งที่มา
comment
บรรทัดใดทำให้เกิดข้อความแสดงข้อผิดพลาด   -  person Pete Becker    schedule 10.01.2013
comment
จากข้อความแสดงข้อผิดพลาด คุณกำลังพยายามกำหนด char[] ให้กับ ตัวชี้ ให้กับ CCString   -  person Angew is no longer proud of SO    schedule 10.01.2013
comment
@Angew คุณควรเพิ่มสิ่งนั้นเป็นคำตอบ   -  person Luchian Grigore    schedule 10.01.2013
comment
@Angew โอ๊ะโอ ความคิดเห็นของคุณไม่ได้อยู่ที่นั่นเมื่อฉันเริ่มเขียนคำตอบ   -  person Masked Man    schedule 10.01.2013
comment
ดูเหมือนว่าโดยทั่วไปแล้วคุณจะใช้พอยน์เตอร์ในทางที่ผิด   -  person leftaroundabout    schedule 10.01.2013
comment
@ Deidara-senpai np โหวตเพิ่ม :-)   -  person Angew is no longer proud of SO    schedule 10.01.2013


คำตอบ (2)


ข้อความแสดงข้อผิดพลาด Assigning to 'cocos2d::CCString *' from incompatible type 'const char [5]' แสดงว่าคุณกำลังกำหนดอาร์เรย์อักขระให้กับตัวชี้ไปที่ cocos2d::CCString

สิ่งนี้ควรจะได้ผล:

char bar[] = "ABCD";
cocos2d::CCString foo;
foo = bar;
person Masked Man    schedule 10.01.2013
comment
จริงๆ แล้ว นั่นจะใช้ตัวคัดลอก ตัวสร้าง ไม่ใช่ตัวดำเนินการมอบหมายการคัดลอก - person leftaroundabout; 10.01.2013
comment
ฉันเข้าใจแล้ว ฉันใช้กับตัวแปรพอยน์เตอร์ แต่การประกาศมีไว้สำหรับวัตถุคงที่ใช่ไหม? ฉันควรเพิ่มโอเปอเรเตอร์อื่นสำหรับตัวชี้ CCString *foo = ABCD หวังว่ามันจะเป็นไปได้ :-( - person PerfectGamesOnline.com; 10.01.2013
comment
@leftaroundabout อ่า คุณพูดถูก มองข้ามไป ขออภัยครับ ให้ฉันแก้ไข. - person Masked Man; 10.01.2013
comment
@ devZone.touchDude.com ทำไมไม่เพียงแค่ยกเลิกการอ้างอิงตัวชี้แล้วทำมันให้เสร็จล่ะ? - person Masked Man; 10.01.2013
comment
@ Deidara-senpai: ฉันกำลังแปลงโค้ดจำนวนมากจาก ObjectC และฉันต้องการเก็บโค้ดที่บอกว่า CCString *str; เป็นคุณสมบัติของคลาสและฉันต้องการใช้ this-›str = test เป็นผู้ได้รับมอบหมาย หากเป็นไปได้ ยังคงพยายามทำให้สิ่งนี้เกิดขึ้นแต่ยังไม่ประสบความสำเร็จ - person PerfectGamesOnline.com; 10.01.2013
comment
@devZone.touchDude.com แล้ว *(this->str) = "test" ล่ะ? - person Masked Man; 10.01.2013

CCString *s_piece__locks = "TEST";
cocos2d::CCString *s_piece__locks2 = "TEST";

นี่มันจะทำอะไรเนี่ย? การประกาศตัวชี้จะไม่สร้างวัตถุใดๆ ยกเว้นตัวชี้เอง โดยพื้นฐานแล้ว เพื่อให้สิ่งนี้ "ใช้งานได้" จะต้องมีวัตถุ CCString อีกอันอยู่แล้ว ซึ่งเกิดขึ้นเพื่อเป็นตัวแทนของสตริง "TEST" แต่ถึงแม้ว่าจะได้รับแล้ว C ++ ควรจะรู้ได้อย่างไรว่าจะชี้ไปที่อันไหน? มันจะต้องค้นหา "TEST" ในบางประเภทเช่น แผนที่แฮช

สิ่งนี้ไม่สมเหตุสมผลเลย เปลี่ยนรหัสของคุณเป็นอย่างใดอย่างหนึ่ง

  • การใช้วัตถุโดยตรงบนสแต็ก:

    cocos2d::CCString s_piece;
    s_piece = "TEST";
    
  • การกำหนดเนื้อหาใหม่ให้กับออบเจ็กต์ที่อยู่ในตำแหน่งอื่น โดยปกติคุณจะใช้ ข้อมูลอ้างอิง สำหรับสิ่งนี้ เช่น

    void assign_test_to(cocos2d::CCString& target) {
      target = "TEST";
    }
    

    ก็สามารถทำได้โดยใช้พอยน์เตอร์

    void assign_test_to_ptr(cocos2d::CCString* target) {
      *target = "TEST";
    }
    

    แต่อย่าทำอย่างนั้นเว้นแต่คุณจะมีเหตุผลเฉพาะเจาะจง

โดยหลักการแล้ว มีความเป็นไปได้อีกอย่างหนึ่ง:

cocos2d::CCString* s_piece_locks = new CCString;
*s_piece_locks = "TEST";

แต่คุณต้องการหลีกเลี่ยงสิ่งนี้ เนื่องจากอาจทำให้หน่วยความจำรั่วได้ง่ายมาก สิ่งที่จะโอเคก็คือ

std::unique_ptr<cocos2d::CCString> s_piece_locks = new CCString;
*s_piece_locks = "TEST";
person leftaroundabout    schedule 10.01.2013