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
?
第二,为什么要使用另一个类来调用自己类的某个函数(eventpublic
或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)设置回调。