0

次の UML クラス図が与えられたとします。

謎の UML クラス図

タイプの変数はMystery関数を呼び出すことができますDoSomething()か?

オブジェクト (たとえばMystery X;) を呼び出しGetA()てプライベート変数int a にアクセスしたり、パブリック変数にアクセスしたりすることができることは理解していint bますが、可能であれば、X.b このオブジェクト 、Xプライベート関数にアクセスするにはDoSomething() どうすればよいでしょうか?

4

3 に答える 3

3

あなたが求めていることを正確に理解するのは困難でしたが、私はそれを理解したと思います.

次の宣言が与えられているかどうかを尋ねる場合:

class Mystery
{
/*...*/
private:
  void DoSomething();
};

次のようなことができます:

Mystery m;
m.DoSomething();

...では、答えはノーです。クラスのコンテキスト外からprivateメンバー関数を呼び出す (またはメンバー変数を参照する)ことはできません。privateの別のメンバー関数のみMysteryが s を呼び出すことができますprivate。例えば:

void Mystery::Foo()
{
  DoSomething();  // this would be possible if Foo() is a member of Mystery
}

編集:

クラス外からメンバーを呼び出せないだけでなくprivate、サブクラスからメンバーを呼び出すこともできません。たとえば、これは無効です。

class Base
{
private:
    void Foo() {};
};

class Child : public Base
{
public:
    void Bar() 
    { 
        Foo();  // ERROR:  Can't call private method of base class
    }
};
于 2011-11-30T20:00:07.393 に答える
1

プライベートメンバー関数をクラスの外部で呼び出すことができる奇妙な方法が1つあります(編集-完全を期すために、複数あります。コメントを参照してください)が、少し工夫された例が必要です。この関数へのポインタ:

class Mystery;
typedef void (Mystery::*fptr)();

class Mystery{
    void DoSomething() {};
public:
    static fptr GetPrivateDoSomething()
    {
        return &DoSomething;
    }
};

int main(int argc, char *argv[])
{
    Mystery m;
    fptr ds = Mystery::GetPrivateDoSomething();
    (m.*ds)();
    return 0;
}

そうは言っても、これをしないでください。プライベートメソッドは、ある理由でプライベートです。これらは、デザインの隠された側面を具体化しており、公開されたインターフェイスの一部になることを意図したものではありません。つまり、動作が変更されたり、完全に削除されたりする可能性があります。さらに、これらの種類のシェナニガンを実行すると、コードが高度に扱いにくく結合される可能性があり、これは望ましくありません。

そうは言っても、私は実際にこれを使用しており、結合を減らすのに役立つまったく異なるコンテキストでしたが、非常にうまく機能します(疑問に思っている場合は、非常にモジュール化されたイベント登録スキームでした)。

于 2011-11-30T20:10:16.940 に答える
0

クラス内のすべてのメソッドは、プライベート変数とメソッドにアクセスできます。他のメソッドを呼び出すのとまったく同じように機能します。クラスの外部から実行しようとすると、コンパイラがエラーを表示するだけです。

于 2011-11-30T19:50:36.890 に答える