Buat objek String dari std::string dengan operator = beban berlebih

Saya sudah mencoba beberapa opsi tetapi kompiler saya tidak mendeteksi operator yang kelebihan beban atau ada hal lain yang salah. Saya menggunakan XCode 4.5.2 dengan kompiler Apple LLVM default 4.1.

Kesalahan yang saya dapatkan adalah ini: Assigning to 'cocos2d::CCString *' from incompatible type 'const char [5]'

pada baris ini:

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

Kode .h saya:

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

Kode .cpp saya (walaupun ini tidak relevan):

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

Bantuan Anda sangat dihargai, terima kasih!


person PerfectGamesOnline.com    schedule 10.01.2013    source sumber
comment
Baris mana yang menghasilkan pesan kesalahan?   -  person Pete Becker    schedule 10.01.2013
comment
Berdasarkan pesan kesalahan, Anda mencoba menetapkan char[] ke dalam penunjuk ke CCString.   -  person Angew is no longer proud of SO    schedule 10.01.2013
comment
@Angew Anda harus menambahkan itu sebagai jawabannya.   -  person Luchian Grigore    schedule 10.01.2013
comment
@Angew ups, komentar Anda tidak ada saat saya mulai menulis jawabannya.   -  person Masked Man    schedule 10.01.2013
comment
Sepertinya Anda biasanya menyalahgunakan petunjuk.   -  person leftaroundabout    schedule 10.01.2013
comment
@ Deidara-senpai np, dapatkan suara positif :-)   -  person Angew is no longer proud of SO    schedule 10.01.2013


Jawaban (2)


Pesan kesalahan Assigning to 'cocos2d::CCString *' from incompatible type 'const char [5]' menyarankan agar Anda menugaskan array char ke pointer ke cocos2d::CCString.

Ini seharusnya berhasil:

char bar[] = "ABCD";
cocos2d::CCString foo;
foo = bar;
person Masked Man    schedule 10.01.2013
comment
Sebenarnya, itu akan menggunakan salinan konstruktor, bukan operator penugasan salinan. - person leftaroundabout; 10.01.2013
comment
Saya mengerti, saya menggunakannya dengan variabel pointer tetapi deklarasinya untuk objek statis, benar? Saya harus menambahkan operator lain untuk pointer CCString *foo = ABCD, semoga bisa :-( - person PerfectGamesOnline.com; 10.01.2013
comment
@leftaroundabout Ah, Anda benar. Mengabaikan itu, maaf. Biarkan saya mengedit. - person Masked Man; 10.01.2013
comment
@devZone.touchDude.com Mengapa tidak melakukan dereferensi penunjuk saja dan menyelesaikannya? - person Masked Man; 10.01.2013
comment
@ Deidara-senpai: Saya mengonversi banyak kode dari objektifC dan saya ingin menyimpan kode yang bertuliskan CCString *str; sebagai properti kelas dan saya ingin menggunakan this-›str = test sebagai pemberi tugas, jika memungkinkan. Masih berusaha mewujudkannya tetapi belum berhasil. - person PerfectGamesOnline.com; 10.01.2013
comment
@ devZone.touchDude.com Bagaimana dengan *(this->str) = "test"? - person Masked Man; 10.01.2013

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

Apa yang harus dilakukan? Mendeklarasikan sebuah pointer tidak menghasilkan objek apa pun kecuali pointer itu sendiri. Jadi pada dasarnya, agar ini "berfungsi", harus ada objek CCString lain yang ada, yang mewakili string "TEST". Tetapi bahkan jika itu diberikan, bagaimana C++ bisa mengetahui mana yang harus ditunjuk? Itu perlu mencari "TEST" di beberapa jenis misalnya. peta hash.

Semua ini tidak masuk akal. Ubah kode Anda menjadi salah satunya

  • Penggunaan langsung objek di tumpukan:

    cocos2d::CCString s_piece;
    s_piece = "TEST";
    
  • Menetapkan konten baru ke objek yang berada di tempat lain. Anda biasanya menggunakan referensi untuk ini, mis.

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

    itu juga dimungkinkan dengan pointer

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

    tapi jangan lakukan itu kecuali Anda punya alasan khusus untuk itu.

Pada prinsipnya, ada kemungkinan lain:

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

namun Anda sebaiknya menghindari hal ini, karena dapat dengan mudah menyebabkan kebocoran memori. Apa yang baik-baik saja adalah

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