Visual Studio 2015中无法初始化成员函数指针的问题求助
解决类成员函数指针赋值的错误问题
这个问题是C++里很常见的普通函数指针和类非静态成员函数指针类型不匹配导致的,我来一步步帮你解决:
错误原因分析
你声明的foo是普通函数指针:int *(*foo)(int),但my_class::function是类的非静态成员函数,这类函数的指针类型是int (my_class::*)(int)——因为非静态成员函数隐含了一个this指针参数,所以它的类型和普通函数指针完全不同,直接赋值自然会报错。另外你还存在一个小问题:foo的返回值类型是int*,但function的返回值是int,类型也不匹配,下面的方案里会一起修正。
下面给你两种可行的解决方案:
方案1:将foo声明为类成员函数指针
如果function必须是非静态成员函数(需要访问类的非静态成员变量),那就要把foo的类型改成对应的成员函数指针:
修改后的头文件:
#pragma once #include <stdio.h> class my_class { private: int function(int x); // 修正为类成员函数指针类型,同时匹配返回值int int (my_class::*foo)(int); public: my_class(); ~my_class(); // 新增测试函数,演示如何调用成员函数指针 void test_call(int x); };
修改后的实现文件:
#include "my_class.h" int my_class::function(int x) { return 1; } my_class::my_class() { // 赋值时必须加上类名限定 foo = &my_class::function; } my_class::~my_class() { } // 调用成员函数指针的特殊语法:(对象->*指针)(参数) void my_class::test_call(int x) { int result = (this->*foo)(x); printf("调用结果:%d\n", result); }
方案2:将function改为静态成员函数
如果function不需要访问类的非静态成员变量,那可以把它改成静态成员函数——静态成员函数没有隐含的this指针,类型和普通函数指针兼容:
修改后的头文件:
#pragma once #include <stdio.h> class my_class { private: // 声明为静态成员函数 static int function(int x); // 保持普通函数指针类型,同时匹配返回值int int (*foo)(int); public: my_class(); ~my_class(); void test_call(int x); };
修改后的实现文件:
#include "my_class.h" // 定义时也要加上static int my_class::function(int x) { return 1; } my_class::my_class() { // 静态成员函数的指针可以直接赋值 foo = &my_class::function; // 或者简化为 foo = function; 也可以 } my_class::~my_class() { } // 调用方式和普通函数指针完全一致 void my_class::test_call(int x) { int result = foo(x); printf("调用结果:%d\n", result); }
内容的提问来源于stack exchange,提问作者Redz
相关产品推荐
相关产品推荐

