我正在尝试编写代码,该代码将调用一个函数,该函数接收指向同一类中其他函数的指针,并从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
答案 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
)。