2016-11-10 4 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(、stagesArr [0] .getImgName()c_str() "%sのイメージ名"。)をしようとしましたか? –

+0

'CCLOG()'は正確に何をしますか? –

+0

@πάνταῥεyourあなたの時間をありがとう。 CCLOGは私に何が起こっているのかを何も表示しません。 ステージ* stagesArrエラー:式にクラスタイプがある必要があります タイプは配列ですが、このエラーの処理方法はわかりません。このメソッドを使用すると、エラーが発生します。グリーティング – Diego

答えて

3

CCLOG()<x>printf()機能を家族のように同じフォーマット規則を使用している疑いのあることは、あなたは書式指定子%sconst char*を渡す必要がありません。

お客様のgetImgName()std::stringという値を返しますが、これはconst char*とは直接互換性がありません。また、あなたがより明確にconstネスの適用を指定するあなたのゲッター/セッターの機能を向上させることができます

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

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

後者を実現するには、std::string::c_str()関数を呼び出す必要があります

注:
署名が十分に明確にされているようなスタイルの問題として、あなたは、Cの++でゲッター/セッターの機能のための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; }; 
}; 
関連する問題