2016-11-10 7 views
0

У меня есть класс, который содержит некоторые настройки уровня игры.Получение строки участника из класса C++

class Stage { 
private: 
    int level; 
    int stars; 
    std::string imgName; 

public: 
    int getLevel(){ return level; }; 
    void setLevel(int n){ level = n; }; 

    int getStars(){ return stars; }; 
    void setStars(int n){ stars = n; }; 

    std::string getImgName(){ return imgName; }; 
    void setImgName(std::string name){ imgName = name; }; 
}; 

Тогда в моей программе я установил информацию.

Stage* stagesArr = new Stage[3]; 

stagesArr[0].setLevel(0); 
stagesArr[0].setStars(1200); 
stagesArr[0].setImgName("stage0.png"); 

Тогда, если я хочу получить эту информацию, строка дает мне нечетный вывод.

CCLOG("Level: %i", stagesArr[0].getLevel()); 
CCLOG("Required stars: %i", stagesArr[0].getStars()); 
CCLOG("Image Name: %s", stagesArr[0].getImgName()); 

//Level:0 
//Required stars: 1200 
//Image Name: T%s //Or just random stuff. 

Что мне здесь не хватает?

+7

ли вы попробовать 'CCLOG ("Название изображения:% S", stagesArr [0] .getImgName() c_str().);'? –

+0

Что именно делает 'CCLOG()' do? –

+0

@ πάνταῥεῖ Спасибо за ваше время. CCLOG не делает ничего, кроме как показывать мне, что происходит. Если я пытаюсь использовать метод c_str(), возникает ошибка: Этап * stageArr Ошибка: выражение должно иметь тип класса Тип - это массив, но я не знаю, что делать с этой ошибкой. Приветствия – Diego

ответ

3

Подозревается, что CCLOG() использует те же правила форматирования как и <x>printf() функция семьи делает, вам нужно пройти const char* с спецификатора формата %s.

Ваш getImgName() возвращает значение std::string, хотя это не относится к const char*.

Для достижения последнего, вы должны вызвать std::string::c_str() функции:

CCLOG("Image Name: %s", stagesArr[0].getImgName().c_str()); 

Кроме того, вы можете улучшить ваш геттер/сеттер функции, задающая const Несса применимости более ясно:

int getLevel() const { return level; } 
       // ^^^^^^ 
    int getStars() const { return stars; } 
       // ^^^^^^ 
    const std::string& getImgName() const { return imgName; } 
// ^^^^^      // ^^^^^^ 
void setImgName(const std::string& name) { imgName = name; } 
      // ^^^^^ 

Примечание:
В самом стиле вы можете опустить префиксы get/set для геттер/сеттер функций в C++, так как подписи достаточно неоднозначность:

int Level() const { return level; } 
void Level(int n){ level = n; } 

int Stars() const { return stars; } 
void Stars(int n){ stars = n; } 

const std::string& ImgName() const { return imgName; } 
void ImgName(const std::string& name){ imgName = name; } 

Мой лично предпочел стиль использовать более низкие шапки и неоднозначность класс переменные-члены с _ постфикса:

class Stage { 
private: 
    int level_; 
    int stars_; 
    std::string img_name_; 

public: 
    int level() const { return level_; } 
    void level(int n) { level_ = n; } 

    int stars() const { return stars_; } 
    void stars(int n){ stars_ = n; } 

    const std::string& img_name() const { return img_name_; } 
    void img_name(const std::string& name) { img_name_ = name; }; 
};