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

C++ 类方法在强制转换后丢失私有修饰符,c++,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 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;}

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

B() { prfn(); }

好的,如果你想实现一个回调,你想传递给另一个类,而这个函数不应该被你的类的其他用户直接调用,那么你肯定做对了,你的函数应该是私有的

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

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

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

通过公开活动暴露私人成员是完全可以的。(这可能不是一个好的设计,但它是完全合法的。)通过使用私有成员作为函数参数用于其他无关的目的,您也在做同样的事情。请注意,只有您自己的
类B
才能访问
B

的私有成员。可见性是针对编译器的。在这里,在B中,传递一个函数指针。表示函数指针的实数。因此,函数从它接收到的物理地址调用函数。可见性不会成为问题,所以。。将window类的私有静态设置为callback以显示button是否可以?@user1307996是的,如果您愿意,可以这样做。它只是一个函数指针,所以任何有编译权限的人都可以用它做任何他们想做的事情,包括传递它的地址。嗯,让我从set()方法的角度来演示:我是set方法。我刚刚收到号码0x2764391917,这是我需要调用的函数的地址。我已经处于执行模式,而不是编译模式,因此不再讨论可见性,而是可访问性。如果我能访问这个内存(不会导致分段错误),那么我当然可以。让我们试试,并调用此地址处的函数。。。我希望这将有助于了解它的工作原理。可见性是编译器的问题,因此编译器可以告诉“不,您不能访问名为“X”的函数”。它被调用,只是为了清楚起见而更改了。。撤消的更改已准备就绪,我必须从我自己的窗口类(这个类是我的)内部为按钮对象(button from library)设置回调。