Создайте объект String из std::string, перегрузив = оператор

Я пробовал несколько вариантов, но мой компилятор не улавливает перегрузку оператора или что-то еще не так. Я использую 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: я конвертирую много кода из ObjectiveC и хочу сохранить код, который, скажем, 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». Но даже если это дано, как С++ должен знать, на что указывать? Ему нужно будет искать "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