1

コールバックを設定する必要がありますが、グローバル関数にしたくありません。パブリックにする必要もないので、プライベートにしました。疑問に思う、それは正しい方法ですか。

class A // button object from window library. I wont change this class
{
public:
    typedef void (*fptr)();
    void set(fptr p)
    {
        p(); // here I call private static of B
    };
};
class B // my own class
{
private:
    static void prfn() {};
public:
    B()
    {
        A a;
        a.set(prfn);
    };
};
int main(){B b;}
4

3 に答える 3

2

クラスB内でのみ具象(プライベート)関数にアクセスする必要があるため、これはまったく問題ありません。クラスAはアクセス指定子を気にせず、唯一のコントラクトは関数ポインター定義と一致する必要がある関数シグネチャです。

于 2012-10-18T17:52:21.557 に答える
1

あなたのコードは問題ありません。次の標準イディオムと違いはありません。

class Foo
{
    int n;
public:
    int & the_int() { return n; }
};

パブリック関数を介してプライベート メンバーを公開することはまったく問題ありません。(これは良い設計ではないかもしれませんが、完全に合法です。) プライベート メンバーを他の無関係な目的の関数引数として使用することで、同じことを行っています。class Bのプライベート メンバにアクセスするのは自分だけであることに注意してくださいB

于 2012-10-18T18:00:00.120 に答える
0

まずset、紹介されていないものを使いAますcallか?次に、別のクラスを使用して、独自のクラスの関数(イベントpublicまたは)を呼び出す必要があるのはなぜですか?privateあなたは簡単に言うことができます:

B() { prfn(); }

OK、別のクラスに渡したいコールバックを実装し、その関数をクラスの他のユーザーが直接呼び出さないようにする場合は、間違いなく正しく実行し、関数はプライベートにする必要があります。

于 2012-10-18T17:51:13.007 に答える