我目前正在努力确保一个类的成员函数仅被另一个类的成员函数调用。
架构是强制性的,不能改变,端口意味着在调用b.call()
之前必须在a.call()
中执行一些逻辑。因此,a.call()
调用b.call()
以简化事情并确保顺序得到尊重。
我发现了这个答案来回答我的问题。只是,问题在于我正在使用类,并且这两个类具有相同的成员函数名称,因此#define
试图替换具有不同原型的所有出现。
我推荐使用密码钥匙模式。这种模式非常适合对函数进行细粒度控制,使得谁可以以何种方式使用你的函数。
我能想到的方案如下:
b.call
设为私有,使b
添加a
或a.call
作为friend
b.call
变成一个类,并将其主体放入一个私有构造函数中,其中a
或a.call
作为friend
b.call
,确保唯一的调用在a.call
中,并在声明处添加注释,说明“如果你调用这个函数,你将被解雇”b.call
更改为至少将其需要的一个值作为参数传递(即使它忽略它并使用来自其他地方的值)a
中的每个函数都可以调用 b.call()
。 - Xeob.call
的可能性,虽然我的问题很具体,但这对我来说已经足够好了。谢谢。 - 3nixios你能否将b.call
改为接收对a
的引用?这样b.call
就可以自己调用a.call
:
struct A {
void call() {
// do stuff
}
};
struct B {
void call(A & a) {
a.call();
// do stuff
}
};
这样可以确保在执行 b.call
的其余部分之前,始终会先调用 a.call
。
使用一个标志如何?
a.call()
{
// ...
flag = 1;
b.call();
flag = 0;
}
b.call()
{
if (flag == 0)
return;
// ...
}
如果你为某个平台编程(比如x86或x64),并且你知道调用约定(例如cdecl),那么你可以从堆栈中获取这些信息。
假设你想要检查调用函数的对象,那么使用在调用成员函数之前推送到堆栈上的this
指针:获取this
指针并将其与所需的对象进行比较(this_pointer == a
)。
如果你想要检查某个函数,从堆栈中获取调用者地址并检查是否与该函数匹配:caller_address == A::call
。如果它是一个虚函数,则使用this
指针来获取vtable
。
根据调用约定和将变量推入堆栈的顺序,你可能需要首先检查输入变量的大小,以便获得所需的信息。