类方法在强制转换后丢失私有修饰符

时间:2012-10-18 17:47:01

标签: c++

我需要设置回调,但我不想让它成为全局函数,我也不需要公开,所以我把它变成了私有的。想知道,这是正确的方法。

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

3 个答案:

答案 0 :(得分:2)

这很好,因为你只需要在类B中访问具体(私有)函数。类A不关心访问说明符,唯一的契约是必须与函数指针定义匹配的函数签名。

答案 1 :(得分:1)

你的代码很好。它与以下标准惯用语没有什么不同:

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

通过公共职能公开私人会员是完全可以的。 (它可能不是一个好的设计,但它完全合法。)你通过使用私有成员作为函数参数来做同样的事情,用于其他一些不相关的目的。请注意,只有您自己的class B才能访问B的私有成员。

答案 2 :(得分:0)

首先,您使用set中未介绍的A,您想说call吗? 第二个为什么你应该使用另一个类来调用你自己的类的某个函数(事件publicprivate)?你可以简单地说:

B() { prfn(); }

好的,如果你想实现一个你想要传递给另一个类的回调,并且该类函数不应该由你的类的其他用户直接调用,那么你当然做得对,你的函数应该是私有的!