【问题标题】:Class method points to other method of other class类方法指向另一个类的其他方法
【发布时间】:2017-02-27 05:58:27
【问题描述】:

我想知道是否有可能让一个类的方法指向另一个类的另一个方法:

考虑一下:

// Class Foo:

class Foo
{
    static int GetA(int a);
    static int GetB(int b);
};



int Foo::GetA(int a)
{
    return a * 2;
}

int Foo::GetB(int b)
{
    return a * 4;
}

// Hooking class methods:

class HookFoo
{
    static int HookGetA(int);
    static int HookGetB(int);
};

int(HookFoo::*HookGetA)(int) = (int(HookFoo::*)(int))0x0; // (0x0 Memory address) or for example: &Foo::GetA;
int(HookFoo::*HookGetB)(int) = (int(HookFoo::*)(int))0x0; // (0x0 Memory address) or for example: &Foo::GetA;

我知道可以做一些类似的事情:

int(*NewHook)(int) = &Foo::GetA;

但是我怎样才能将方法声明到一个类中呢?

【问题讨论】:

  • 单纯做static int HookGetA(int n) { return Foo::GetA(n); }不可行吗?我不清楚你想做什么
  • 你不能重新声明/重新分配函数,但你可以在HookFoo中使用函数指针(如你所演示的)
  • 不,问题是它是用于内存地址的,我不能这样做,我发布的表格是一个简单的例子。
  • 好吧,如果这些是静态函数,它们不需要(不应该)限定在类中,它们只是 int (int) 函数

标签: c++ pointers c++14


【解决方案1】:

这或多或少是您尝试实现的目标(最小的工作示例):

class Foo
{
public:
    static int GetA(int a);
    static int GetB(int b);
};

int Foo::GetA(int a)
{
    return a * 2;
}

int Foo::GetB(int b)
{
    return b * 4;
}

class HookFoo
{
public:
    using FuncType = int(*)(int);
    static FuncType HookGetA;
    static FuncType HookGetB;
};

// Initialized with Foo::GetA
HookFoo::FuncType HookFoo::HookGetA = &Foo::GetA;
// nullptr'ed
HookFoo::FuncType HookFoo::HookGetB = nullptr;

int main() {
    HookFoo::HookGetA(0);
}

Foo 中的方法是静态的,可以使用简单的函数指针类型来引用它们。在这种情况下,您不必使用(也不能实际使用)成员函数指针。
using 声明有助于使代码更具可读性。
当您正确初始化 钩子 后,您可以调用它们(因此是指向函数),正如您在 main 中看到的那样。
我为您的方法添加了几个可见性说明符,并且数据成员都是私有的。

【讨论】:

    【解决方案2】:

    您可以使用函数指针。
    例如:

    class A {
    public:
        static void say_hello() { cout << "Hello\n"; }
    };
    
    class B {
    public:
        static void(*hook)();
    };
    void(*B::hook)() = A::say_hello;
    
    int main()
    {   
        B::hook();
    }
    

    【讨论】:

      【解决方案3】:

      如果您需要挂钩到特定地址的函数,请使用函数指针。你不能重新分配这样的功能

      // typedef your function pointers, it makes the syntax a lot easier
      typedef int(*FHook)(int);
      
      class HookFoo
      {
        static FHook HookGetA;
        static FHook HookGetB;
      };
      
      // assign to address
      FHook HookFoo::HookGetA = (FHook)0x1234;
      FHook HookFoo::HookGetB = (FHook)0x5678;
      

      当然,确保地址正确是您的工作。

      显式函数指针类型如下:

      class HookFoo
      {
        static int (*HookGetA)(int);
        static int (*HookGetB)(int);
      };
      
      int (*HookFoo::HookGetA)(int) = (int(*)(int))0x1234;
      int (*HookFoo::HookGetB)(int) = (int(*)(int))0x5678;
      

      【讨论】:

      • 是的,但是您知道是否有其他方法可以在没有 typedef 的情况下做到这一点?非常感谢。
      • @nikomaster,每次都可以手写类型。然而,typedefing 不是代码混淆中最受虐的练习。
      • @nikomaster 你为什么要反对typedef
      • @vu1p3n0x 因为我想知道如何在不使用数据类型的情况下手动操作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 2017-11-18
      • 2021-10-23
      相关资源
      最近更新 更多