一个基础小问题

时间:2022-10-17 17:38:37


// 这是一个测试类,没意义
class CTest
{
public:
CTest(){}
~CTest(){}

public:
int Output( char * szBuf )
{
std::cout<<szBuf<<std::endl;
return 0;
}
};

typedef int (CTest::*TestFunc)(char * szBuf );
std::vector<TestFunc> m_vtTest;

int main()
{
CTest test;
m_vtTest.push_back( &CTest::Output );

m_vtTest[0]("test"); // 这里编译有错误,说表达式必须具有(pointer-to-) 的函数类型
}

大神告诉我可以这么用:
     
 (test.*m_vtTest[0])("test");

确实,但是有个问题:m_vtTest在定义、push_back 的时候,并没有创建CTest对象,该怎么用 m_vtTest 去掉用函数呢?

为什么 m_vtTest[0]("test");  不能用呢?

9 个解决方案

#1


这是.*操作符的使用啊。

#2


你直接用成员函数,没有对象怎么用?这是最基本c++类原则。

#3


成员函数指针必须由对象调用, 没有什么道理可讲。 

#4


调用成员函数,必然是调用某个对象的成员函数。因为这个成员函数默认有个this指针,指向一个对象。

没有对象的话,这个成员函数内部对成员变量的读和写到底是针对的哪个对象??所以必须有明确的对象来调用成员函数

#5


据说c++11的lambda可以做到无对象回调函数?

#6


请教楼主:楼主能不能解释一下这句是什么意思???
typedef int (CTest::*TestFunc)(char * szBuf );

#7


引用 5 楼 bear234 的回复:
据说c++11的lambda可以做到无对象回调函数?

那貌似也不是成员函数吧!

#8


可以这么写

#9



#include <functional>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
CTest obj;
vector<function<int(char*)>> v;
v.push_back(bind(&CTest::Output, &obj, placeholders::_1));
auto f = v[0];
char * s = "abc";
f(s);
}

#1


这是.*操作符的使用啊。

#2


你直接用成员函数,没有对象怎么用?这是最基本c++类原则。

#3


成员函数指针必须由对象调用, 没有什么道理可讲。 

#4


调用成员函数,必然是调用某个对象的成员函数。因为这个成员函数默认有个this指针,指向一个对象。

没有对象的话,这个成员函数内部对成员变量的读和写到底是针对的哪个对象??所以必须有明确的对象来调用成员函数

#5


据说c++11的lambda可以做到无对象回调函数?

#6


请教楼主:楼主能不能解释一下这句是什么意思???
typedef int (CTest::*TestFunc)(char * szBuf );

#7


引用 5 楼 bear234 的回复:
据说c++11的lambda可以做到无对象回调函数?

那貌似也不是成员函数吧!

#8


可以这么写

#9



#include <functional>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
CTest obj;
vector<function<int(char*)>> v;
v.push_back(bind(&CTest::Output, &obj, placeholders::_1));
auto f = v[0];
char * s = "abc";
f(s);
}