2

C++ 言語で実行時にクラス属性を変更することは可能ですか。たとえば、次のようになります。

class base
{
    public:
        //public members

    private : 
        //private members
};

class derived1 : attribute base
{
    public:
        //public members
        base::<base method name> //so that it an be made accessible from the main - outside the class.

    private:
        //private members
};

属性 public,private,protected を実行時に動的に変更できますか?

Rgds、ソフト

4

3 に答える 3

4

privateメンバーにアクセスしないようにするのはコンパイラです。コンパイラが作業を終了し、バイナリ コードが生成されると、プライベート性に関するすべての情報が失われます。

いいえ、実行時に変更することはできません。

なぜこれが必要なのかわかりませんが、一部の関数をある時間だけ呼び出せるようにしたい場合は、それらを呼び出すことができるかどうかを定義する変数を使用できます。次に、その関数の上に:

int Class::function(...)
{
    if (!function_is_allowed)
        return OPERATION_NOT_ALLOWED;
    ...
}
于 2012-05-09T12:10:00.120 に答える
2

いいえ、アクセス レベルを変更することはできませんが、回避するためのいくつかのハックがあります。

この回答を参照してください - https://stackoverflow.com/a/6886432/673730

探しているものが Java リフレクションに似たもので、実行時にアクセス レベルを変更することでプライベート メンバーにアクセスできる場合は、いいえ。

于 2012-05-09T12:06:25.717 に答える
1

クラスのアクセス修飾子は変更できません。話の終わり。

免責事項:これを含め、ほぼすべてのハックがあります。それらを使用しないでください。

なぜこれが必要なのかを尋ねられたときの質問のコメントに基づいて、他の実行時プロパティに基づいてクラスの実行時プロパティへのアクセスを制御しようとしているようです。たとえば、が>= 42CharacterPowers場合にのみ、 にアクセスできます。CharacterLevel

これは C++ 構文の仕組みに関する技術的な質問ではなく、ビジネス ロジックに関する質問です。この質問に対する答えは、C++ の技術的なトリックではなく、プログラムとそのアルゴリズムの設計にあります。

クラスは、物事をモデル化するためによく使用されます。あなたの場合、ゲームのキャラクターです。おそらく、このキャラクターにはレベルとパワーのリストがあります (これを単純にstrings で表します)。

その場合:

class Character
{
public:
  int level_;
  vector<string> powers_;
};

...は、キャラクター モデルの単純化された表現です。powers_の値に基づいて実行時にへのアクセスを制御する場合は、アクセサ メソッドlevel_を使用できます。

class Character
{
public:
  int level_;
  vector<string> Powers() const 
  {
    if( level_ >= 42 )
      return powers_;
    else
      return vector<string>();
  }
private:
  vector<string> powers_;
};

キャラクターのレベルが十分に高い場合にのみ、キャラクターの能力を発揮できるようになりました。

これはまだ非常に単純化された例であり、上記のコードは製品品質ではありません。ただし、アイデアはそこにあります。プログラムのビジネス ロジックを実装するときは、C++ や使用している言語の技術よりも、作成するアルゴリズムに重点を置く必要があります。

于 2012-05-09T14:56:56.320 に答える