指向无静态方法的指针静态方法

时间:2017-04-01 01:58:49

标签: c++ visual-c++

我一直在尝试创建一个指向一个方法的指针函数(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)(无效)“(?PSomeMethod @ Dy @@ 2P6GHXZA)尚未解决

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

3 个答案:

答案 0 :(得分:1)

JLabel的类型为&test::tst是成员函数指针

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

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

int (test::*) (int)

答案 1 :(得分:1)

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

类型已选中,因此没有来自编译器的抱怨。

至于:

Dy::pSomeMethod();

这是__cdecl。 但是,SomeMethod是__thiscall,这意味着它真的像这样

int SomeMethod( Dx &this);

因此,链接器无法找到匹配项。

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

答案 2 :(得分:1)

您对pSomeMethod的声明定义了指向类Dy中返回int的函数的指针。您希望将其声明为链接器错误中显示的内容:

int (*Dy::pSomeMethod)();

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

您尝试做的事情不会奏效,因为Dx::SomeMethodDx的成员函数,需要this指针。通过pSomeMethod拨打电话不会有一个。

完成后,您可以在不使用强制转换的情况下将函数的地址分配给指针。