我目前正在尝试确保一个类的成员函数仅由另一个类的成员函数调用。
架构是强制的,无法更改,端口意味着在调用a.call()
之前必须在b.call()
中完成某些逻辑。因此,a.call()
会调用b.call()
来简化操作,并确保订单得到尊重。
我在问题中找到了this answer。唯一的问题是我正在使用类,并且这两个类具有相同的成员函数名称,因此#define
尝试替换具有不同原型的所有实例。
答案 0 :(得分:7)
我推荐passkey pattern。对于谁可以用你的功能做什么来进行细粒度控制是非常好的。
答案 1 :(得分:3)
在我的头顶,选项将是:
b.call
设为私有,并b
将a
或a.call
添加为friend
b.call
转换为一个类,并将正文放入一个私有构造函数中,a
或a.call
作为friend
b.call
的源代码,确保唯一的调用位于a.call
,并在声明中添加注释,说“如果你调用此函数,你将被解雇”b.call
以至少将其需要的一个值作为参数(即使它忽略它并使用其他地方的值)答案 2 :(得分:1)
您可以更改b.call
以引用a
吗?这样,b.call
可以调用a.call
本身:
struct A {
void call() {
// do stuff
}
};
struct B {
void call(A & a) {
a.call();
// do stuff
}
};
这可确保在执行a.call
的其余部分之前始终调用b.call
。
答案 3 :(得分:0)
使用旗帜怎么样?
a.call()
{
// ...
flag = 1;
b.call();
flag = 0;
}
b.call()
{
if (flag == 0)
return;
// ...
}
答案 4 :(得分:0)
如果您为某个平台(比如x86或x64)编程,并且您知道调用约定(例如cdecl),那么您可以get this info from the stack
假设您要检查调用该函数的对象,因此在调用成员函数之前使用推送到堆栈的this
指针:获取{{1}指针并将其与您想要的对象(this
)
如果要检查某个功能,请从堆栈中获取呼叫者地址并检查该功能:this_pointer == a
。如果它是虚函数,请使用caller_address == A::call
指针获取this
。
根据调用约定和在堆栈上推送变量的顺序,您可能必须首先检查输入变量大小,以获取所需的信息。