1

わかりましたので、C++ のクラスの C# のプロパティのようなものを作成しようとしています。

例えば。C#で私はこれを行います:

int MaxHP { get; set; }

または、バッキング フィールドを使用:

int MaxHP 
{ 
    get { return maxHP; }
    set { maxHP = value; }
}

ただし、これまでのところ C++ では、次の方法でしか再現できませんでした。

private:    
    int maxHP;  
    int maxEP;
public:
    int GetMaxHP() { return maxHP; }
    void UpSetMaxHP(int value){ maxHP += value; }
    void DownSetMaxHP(int value){ maxHP -= value; }
    int GetMaxEP(){ return maxEP; }
    void UpSetMaxEP(int value){ maxEP += value; }
    void DownSetMaxEP(int value){ maxEP -= value; }

物事が設計されるべき方法で何かが欠けているに違いありません。C# では、プロパティはフィールドのようなアクセスになります。ただし、C++ では、他のオブジェクトからアクセスすると異なる動作をする関数を実行する必要があります。

私はできると思います:

public:
    int MaxHP;

しかし、それは私が目的を打ち負かしているように感じます. だから私の質問は、私はこれを正しくやっていますか、それともこれを達成するためのより良い、適切な方法はありますか?

4

4 に答える 4

2

ゲッター関数とセッター関数を別々に作成するのではなく、次のいずれかの方法で使用できる参照を返す関数を使用できます。

public:   
    int &max_hp() { return maxHP; }

maxHP publicを単に遅延させるのとは異なり、これにより、変数がいつアクセスされるかを確認するためのブレークポイントを配置できます。後で条件やロギングを追加する場合は、クラスインターフェイスを変更せずに追加できます。

于 2013-03-15T23:55:02.500 に答える
1

この機能は C/C++ にはありません。欠けているのは欠陥だと簡単に主張できますが、すべての言語が同じというわけではありません。C# になくて Java にあるのは、シングルトン オブジェクトのような列挙型です。それ以外の場合、IMO は少し時代遅れの言語ですが、C# に欠けている確かな機能が 1 つあります。

私が言いたいのは、これらの問題に遭遇すると、多くの場合、本当の弱点や設計上の欠陥が見つかるということです。何かが欠けているだけかどうかを尋ねるのは良いことですが (したがって、私の賛成です)、さまざまな言語の長所と短所を学ぶと、どの言語がどの仕事に適しているかがわかり、DSL や言語拡張機能を早期に作成するのに効果的である可能性があります。あなたのキャリアの中で。

于 2013-03-15T23:37:48.203 に答える
0

C++ のゲッター関数とセッター関数を取り除くために、ソフトウェアで使用するほとんどのデータ型を取得および設定する単純なマクロを作成しました。そのためにもテンプレートは役に立ちます。例えば

#define GET_BOOL(name) bool is##name() const {return name##_;}
#define SET_BOOL(name) void set##name(bool name) {name##_ = name;}
#define GET_SET_BOOL(name) GET_BOOL(name) SET_BOOL(name)
于 2013-03-15T23:34:03.040 に答える
0

C/C++ はデフォルトでこのようなものをサポートしていませんが、int getHP()andなどの関数を持つことは一般的ですvoid setHP(int)が、c# の get/set の動作にかなり近い機能を実現するための一種の演算子「ハック」があります。しかし、これを回避するためのコードは非常に厄介で、多くのバグを引き起こす可能性があります。

例 (2 回目の投稿): http://forums.codeguru.com/showthread.php?459696-GET-SET-in-C

于 2013-03-15T23:34:19.443 に答える