代码之家  ›  专栏  ›  技术社区  ›  Diego

从类C获取成员字符串++

  •  0
  • Diego  · 技术社区  · 8 年前

    我有一个包含一些游戏级别设置的类。

    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.
    

    1 回复  |  直到 8 年前
        1
  •  3
  •   πάντα ῥεῖ    8 年前

    CCLOG() 使用相同的格式规则,如 <x>printf() 函数族,您需要通过 const char* 使用格式说明符 %s .

    你的 getImgName() 返回 std::string 值,但与 常量字符* .

    要实现后者,您应该调用 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; }
                 // ^^^^^ 
    

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

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