指向类中函数方法的指针不起作用

时间:2018-07-16 16:05:33

标签: c++ function-pointers

我正在尝试编写代码,该代码将调用一个函数,该函数接收指向同一类中其他函数的指针,并从main调用get_num方法。 但是当从main包含到TestClass.h时,我遇到了链接错误

class TestClass{
public:     
    void get_num(int num);
    void foo(int num, void(TestClass::*function)(int));
    void boo(int num);
};

void TestClass::boo(int num)
{
    std::cout << "number: " << num << std::endl;
}

void TestClass::foo(int num, void(TestClass::*function)(int))
{   
    (this->*function)(num);
}

void TestClass::get_num(int num)
{
    foo(num, &TestClass::boo);
}

以下是主要代码:

#include "TestClass.h"

int main()
{
    TestClass tc1;
    tc1.get_num(5);
    system("pause");
    return 1;
}

出现以下错误:

1>main.cpp
1>TestClass.obj : error LNK2005: "public: void __thiscall TestClass::boo(int)" (?boo@TestClass@@QAEXH@Z) already defined in main.obj
1>TestClass.obj : error LNK2005: "public: void __thiscall TestClass::foo(int,void (__thiscall TestClass::*)(int))" (?foo@TestClass@@QAEXHP81@AEXH@Z@Z) already defined in main.obj
1>TestClass.obj : error LNK2005: "public: void __thiscall TestClass::get_num(int)" (?get_num@TestClass@@QAEXH@Z) already defined in main.obj
1>c:\Proj4.exe : fatal error LNK1169: one or more multiply defined symbols found

1 个答案:

答案 0 :(得分:2)

指向方法的指针与指向简单函数的指针不同。如果仅希望能够接受指向同一类的方法的指针,则可以这样重写方法:

File "/root/.venvs/netadc/lib/python2.7/site-packages/Django-1.11-py2.7.egg/django/db/migrations/loader.py", line 203, in build_graph
    self.load_disk()
  File "/root/.venvs/netadc/lib/python2.7/site-packages/Django-1.11-py2.7.egg/django/db/migrations/loader.py", line 107, in load_disk
    for name in os.listdir(directory):
OSError: [Errno 20] Not a directory: '/root/.venvs/netadc/lib/python2.7/site-packages/django_background_tasks-1.1.13-py2.7.egg/background_task/migrations'

这允许void TestClass::foo(int num, void(TestClass::*function)(int)) { (this->*function)(num); } void TestClass::get_num(int num) { foo(num, &TestClass::boo); } 接受指向foo()中任何方法的指针,但不能指向任何其他类的方法或简单函数的指针。它还会在同一对象上调用接收到的方法(注意:TestClass中的this)。