是否可以在C++中创建一个指向非静态成员函数的指针
Is it possible to create a pointer to a non-static member-function in C++?
我想知道是否可以创建并使用指向非静态成员函数的指针。当我在没有指向成员函数的指针为静态的情况下编译代码时,会出现编译错误。
谢谢。。。
简而言之:是的,这是可能的,不,它不会按照你的想法去做。
关键的事实是,非静态成员函数不是函数(就像道格拉斯冷杉不是冷杉一样)。它们是成员函数,这是不同的。它们只能在给定的对象实例上调用。
因此,为了调用给定实例X a;
的成员函数X::foo()
,即执行调用a.foo()
,您需要既要使用X::foo()
又要在实例a
上调用它的信息。前者由指向成员函数的指针提供,不是指针,而后者由实例指针或引用提供:
struct X { int foo(bool, char); }; // class definition
X a; // an instance
X * p = &a; // just for demonstration
int (X::*)(bool, char) ptmf = &X::foo; // pointer-to-member-function
现在调用:
(a.*ptmf)(false, 'a');
(p->*ptmp)(true, 'z');
简而言之:foo
本身并不能让你调用任何东西。可调用的实体是对(&X::foo, a)
,它允许您调用a.foo()
。
是的,可以在C++中创建指向成员函数的指针。请参阅以下常见问题解答:指向成员的指针
相关文章:
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- C++ - 非静态 void* 成员,指向具有相同地址但不同值的不同对象的另一个非静态成员
- 我正在尝试在我的类中创建一个静态成员,但编译器警告我它是未定义的
- 为什么有一个额外的 & 将非静态成员函数的地址传递给 C++ 中的线程?
- 长镜头 -- 可能有一个静态类成员,该类成员具有访问非静态成员的 lambda
- 如果我创建一个修改值的迭代器,静态成员"reference"应该是什么类型?
- 来自另一个非静态的非静态成员初始值设定项
- 一个类本身有一个静态成员的功能是什么?
- 为什么没有将虚拟静态成员添加为C++的一个功能
- 在头文件中声明一个静态类成员
- 从另一个类访问静态成员函数
- 你能在成员函数中创建一个静态变量吗?这个变量在该类的实例中是静态的
- 为什么一个非常量静态成员会有多个定义
- 设置一个回调函数,该函数是类的非静态成员函数
- 如果一个类不是直接从main中使用的,但有一个静态私有成员,那么在编译和链接时,可以使用最大优化来忽略它吗
- 从另一个方法调用非静态成员方法
- 导出另一个dll的静态成员
- 将异步操作的处理程序绑定到另一个类的非静态成员
- 如何访问另一个类的静态成员函数中的私有静态变量
- 是否可以在C++中创建一个指向非静态成员函数的指针