如何检查另一个函数调用的函数?

时间:2011-07-01 08:32:50

标签: c++ class function

我目前正在尝试确保一个类的成员函数由另一个类的成员函数调用。

架构是强制的,无法更改,端口意味着在调用a.call()之前必须在b.call()中完成某些逻辑。因此,a.call()会调用b.call()来简化操作,并确保订单得到尊重。

我在问题中找到了this answer。唯一的问题是我正在使用类,并且这两个类具有相同的成员函数名称,因此#define尝试替换具有不同原型的所有实例。

5 个答案:

答案 0 :(得分:7)

我推荐passkey pattern。对于谁可以用你的功能做什么来进行细粒度控制是非常好的。

答案 1 :(得分:3)

在我的头顶,选项将是:

  • b.call设为私有,并baa.call添加为friend
  • b.call转换为一个类,并将正文放入一个私有构造函数中,aa.call作为friend
  • grep 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

根据调用约定和在堆栈上推送变量的顺序,您可能必须首先检查输入变量大小,以获取所需的信息。