函数指针和访问-为什么这个代码是合法的
Function Pointers and Access - Why is this code legal?
我最近遇到了一些让我惊讶的事情,如果能澄清一下就好了。
假设我有一个A
类,它由以下部分组成:
#include "B.h"
class A {
private:
B* inst_b;
std::mt19937 mt_eng;
static void update_routine(double& _p, std::mt19937& _eng) {
// does stuff, not important here
}
public:
A() {
std::random_device rd;
mt_eng = std::mt19937(rd());
}
void updateP() {
inst_b->update_quantity(update_routine, mt_eng);
}
//...
};
以及如下的类别CCD_ 2:
#include <random>
class B {
protected:
double qty;
//...
public:
B() {
qty = 0.0;
}
void update_quantity(void(*fptr)(double&, std::mt19937&), std::mt19937& _eng) {
fptr(qty, _eng); // no error here
}
//...
};
现在我认为编译器会抱怨试图调用update_quantity
主体中的函数,因为A
的update_routine
是private
成员函数,因此我认为试图从B
调用它会导致inaccessible method
错误或类似的错误,即使它是作为函数指针传递的。
在我的项目中,当我完成上述操作时,它会成功编译并执行——为什么会这样?诚然,它确实编译和运行了,这对我来说非常有用,但我想了解为什么会出现这种情况。
p.S:如果这是重复的,我很抱歉,如果是这样的话,请链接相关主题。
术语public和private(以及protected)实际上只指事物的名称——名称update_routine
是私有的,只能解析为类范围内的实际函数。由于您只在类的作用域内使用名称,因此没有问题。
class B {
protected:
double qty;
public:
B() {
qty = 0.0;
}
void update_quantity(void(*fptr)(double&, std::mt19937&), std::mt19937& _eng) {
fptr(qty, _eng); // no error here
}
};
上述代码中没有引用A
类。您正在取消引用中的fptr
update_quantity
功能,但原型对于fptr
没有任何对A
类,因此不存在来自B类至A.
update_routine
的地址可能作为函数指针参数-但A函数仍然没有直接编码在B类中,正如所写的那样。换句话说,如果函数指针只是一个参数,那么取消引用该函数指针参数并不一定会导致类特权冲突。
fptr
是update_quantity
的严格局部,不被认为是A类的一部分。。
它是从A内部传递的,在那里它非常明显。可见性不会更改函数的类型。如果您试图从B::update_quantity
调用A::update_routine
,这将是非法的。但A已经将地址赋予了B,并将函数调用委托给了它。同时,B不知道它接收到什么函数地址。
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如何防止C++遗留代码中的挂起指针
- 理解这行C++指针代码
- 为什么我们不在下面给出的代码中使用指针来实例化C++的实体对象?
- 为什么我的代码在指针方面停止运行?
- 以下与指针相关的代码的输出是什么?
- C++指针问题:如何修复这些代码中的错误?
- 如何使用指针直接从托管代码中的非托管代码中读取矢量数据
- 为什么下面的代码段返回指针指向的值而不是指针的地址?
- 使用指针向量(带代码)C++(以及对其使用的便利性的怀疑)时出现问题
- 为什么从 constexpr 引用生成的程序集代码与从 constexpr 指针生成的程序集代码不同?
- 由于指针算法错误,代码在 memcpy 中崩溃
- 为什么通过定义另一个指针单元格,整个代码停止工作?
- 使用指针编译代码后,.cpp文件将变为随机字符
- OpenCV如何处理Mat作为指针来加速代码
- 更正代码c++指针并删除
- C++指向对象的指针堆数组中,如何将字符串传递给特定对象?有一些代码请看一下:
- C++ 被此代码与多态性、指针和对象切片混淆
- LLvm Jit:如何从抖动代码中取消引用运行时指针?
- 将 C 代码移植到C++,将 void* 从 malloc 转换为所需指针的问题