2014-01-08 1 views
-2

У меня есть следующий код в моем cocos2d C++ приложения, но код не компилляции:C++ станда: ошибка компиляции строки

std::string MyBasketTimer::getImageByType(MyBasket* basket) { 
     std::string retVal=NULL; 
     if(getBasketType()==1){ 
      retVal= new std::string("count_bg.png"); 
     } 
     else if(getBasketType()==2){ 
      retVal= new std::string("count_bg.png"); 
     } 

     return retVal; 
    } 

Ошибка получает

invalid conversion from 'std::string* {aka std::basic_string<char>*}' to 'char' [-fpermissive] 

Что я делаю неправильно?

+5

Проблема заключается в том, что вы пытаетесь написать Java или C#, но на C++. Вы должны забрать книгу хорошего новичка и начать читать. – molbdnilo

+2

[Здесь] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) - список таких книг. –

ответ

-2

Ваш код будет правильным, если тип возвращаемого значения функции будет std::string *. Например

std::string * MyBasketTimer::getImageByType(MyBasket* basket) { 
     std::string *retVal=NULL; 
     if(getBasketType()==1){ 
      retVal= new std::string("count_bg.png"); 
     } 
     else if(getBasketType()==2){ 
      retVal= new std::string("count_bg.png"); 
     } 

     return retVal; 
    } 

Однако вы заявили функции таким образом, что она имеет типа std::string возврата. Таким образом, действительная реализация функции будет выглядеть следующим образом.

std::string MyBasketTimer::getImageByType(MyBasket* basket) { 
     std::string retVal; 
     if(getBasketType()==1){ 
      retVal.assign("count_bg.png"); 
     } 
     else if(getBasketType()==2){ 
      retVal.assign("count_bg.png"); 
     } 

     return retVal; 
    } 
+1

Но вызывающий должен удалить указатель в первом случае – Bathsheba

+1

@Bathsheba И в чем проблема? –

+7

@ VladfromMoscow проблема в том, что это хрупкое решение, и OP будет использовать его, а не удалять, а затем жаловаться, что C++ нуждается в GC и т. Д. И т. Д. :-) – juanchopanza

3

Уступка std::string retVal = NULL; недействительна. Просто по умолчанию создайте его, используя std::string retVal;

Также отбрасывайте ключевые слова new, создавая объекты в куче и обратные указатели к ним. Вам нужно, например, retVal = std::string("count_bg.png"); (Это одно важное отличие между C++ и Java).

+0

+1, но, возможно, стоит отметить, что 'std :: string retVal = NULL;' будет компилироваться, но будет работать во время выполнения. – juanchopanza

3

В C++ (в отличие от некоторых других языков) вам не нужно выделять все переменные класса с помощью new. Просто назначьте его.

retVal= "count_bg.png";

4

Ваш возвращаемый тип std::string но вы пытаетесь присвоить указатель на std::string к нему:

retVal= new std::string("count_bg.png"); 

Вам нужно назначить std::string для retVal:

retVal = std::string("count_bg.png"); 

или использовать неявное преобразование из строкового литерала:

retVal = "count_bg.png"; 

Кроме того, этот

std::string retVal=NULL; 

, скорее всего, приведет к ошибке во время выполнения, вы не можете создать экземпляр строки с нулевым указателем. Это вызовет конструктор std::string, который принимает const char*, и предполагается, что он указывает на строку с нулевым завершением.

+3

Конечно, этот ответ настолько ужасно ошибочен, что он заслуживает голосования :-) – juanchopanza

3

std::string retVal не указатель. Вы не можете инициализировать его с помощью NULL (это скорее должно быть nullptr ...), а также не назначать результат выделения памяти через new.

Просто не инициализируйте его и не назначьте непосредственно строку.

std::string retVal; 
//... 
retVal = "count_bg.png" 
//... 
return retVal; 
Смежные вопросы