从c++类中获取成员字符串

Getting Member String from Class C++

本文关键字:成员 字符串 获取 c++      更新时间:2023-10-16

我有一个包含一些游戏关卡设置的类。

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

然后在我的程序中设置info.

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.

我在这里错过了什么?

怀疑CCLOG()使用与 <x>printf() 函数族相同的格式规则,您需要传递带有格式说明符%sconst char*

你的getImgName()返回一个std::string值,但这与const char*不直接兼容。

要实现后者,您应该调用std::string::c_str()函数:
 CCLOG("Image Name: %s", stagesArr[0].getImgName().c_str());

还可以改进getter/setter函数,更清楚地指定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; }
             // ^^^^^ 

注意:
作为风格问题,您可以省略c++中getter/setter函数的get/set前缀,因为签名已经足够消歧了:

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