【问题标题】:Pointer static method that points to no static method指向无静态方法的指针静态方法
【发布时间】:2017-04-01 01:58:48
【问题描述】:

我一直在尝试创建一个指针函数,该函数指向一个执行类似这样的方法的方法(Visual C++):

struct test
{
  int tst(int a)
  {
    return a * 4;
  }
};
// ok, this the visual C++ compiler does not accept it... (mingw accept it)

int(*tstptr)(int) = (int(*)(int))&test::tst;

然后我做了这样的事情:

struct Dx
{
    int SomeMethod()
    {
        return 4;
    }
};

struct Dy
{
    static int(*pSomeMethod)();    
};

int(Dy::*pSomeMethod)() = (int( Dy::*)())&Dx::SomeMethod;

到目前为止一切顺利,编译没有问题,但如果我尝试打电话给她:

Dy::pSomeMethod();

编译器返回我:

错误 1 ​​错误 LNK2001: 外部符号 "public: static int (__stdcall * Dy::pSomeMethod) (void)" (?PSomeMethod@Dy@@2P6GHXZA) 未解决

我不明白,因为不是假设pSomeMethod他没有指向SomeMethod

【问题讨论】:

  • 你不明白函数指针和类方法指针的根本区别。它们是两个完全不同的东西,你不能在两者之间转换。也不能将一个类的类方法指针转换为不同类的类方法指针。

标签: c++ visual-c++


【解决方案1】:

&test::tst的类型是int (test::*) (int),是成员函数指针

您正在尝试将其转换为 常规 指针类型,这是不可能的,因为它们完全不同。

这就是为什么你会遇到这个类型转换错误:

error C2440: 'type cast' : 
cannot convert from 'int (__thiscall test::* )(int)' to 'int (__cdecl *)(int)'

【讨论】:

    【解决方案2】:
    int(Dy::*pSomeMethod)() = (int( Dy::*)())&Dx::SomeMethod;
    

    类型检查,所以编译器不会抱怨。

    至于:

    Dy::pSomeMethod();
    

    这是一个 __cdecl。 但是,SomeMethod 是一个 __thiscall,也就是说它真的是这样的

    int SomeMethod( Dx &this);
    

    所以,链接器找不到匹配项。

    如果没有 Dx 类的对象,您根本无法调用非静态方法。

    【讨论】:

      【解决方案3】:

      您对pSomeMethod 的声明定义了一个指向Dy 类中返回int 的函数的指针。您要声明它,因为它出现在链接器错误中:

      int (*Dy::pSomeMethod)();
      

      它是Dy 的成员,它是指向返回int 的函数的指针。

      您尝试执行的操作不起作用,因为Dx::SomeMethodDx 的成员函数,它需要this 指针。通过pSomeMethod 拨打电话不会有。

      如果操作正确,您可以将函数的地址分配给指针,而无需使用强制转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-25
        • 2013-05-21
        相关资源
        最近更新 更多