类中用函数指针,怎么提示形参和实参类型不对应,是什么原因?

zxphxh 2021-03-06 10:15:49
//定义了一个类,定义三个函数,见下面:
class CTestF
{
protected:
bool F1(int a, int b);
bool Test(int m, int n, bool (*pf)(int ,int));
void Get();
};
bool CTestF::F1(int a, int b)
{
if(a>b) return true;
else return false;
}

bool CTestF::Test(int m, int n, bool (*pf)(int ,int))
{
return pf(m,n);
}
void CTestF::Get()
{
int t = 10;
int h = 20;
Test(t, h, F1);//此处提示F1错误:bool (TestF::*)(int a, int b)" 类型的实参与 "bool (*)(int, int)" 类型的形参不兼容
//错误 C3867 “TestF::F1”: 非标准语法;请使用 "&" 来创建指向成员的指针
// 而用&F1也提示错误!
}
----------在线急等大侠指教!!!!!!!
...全文
821 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒙飞鸿 2021-05-08
  • 打赏
  • 举报
回复
应该也可以这么改bool Test(int m, int n, bool (TestF::*)(int ,int));
蒙飞鸿 2021-05-08
  • 打赏
  • 举报
回复
成员函数和函数是两回事哦,尤其做函数指针时,就要注意这个差异了,c++编译器不认为两者等同
schlafenhamster 2021-04-23
  • 打赏
  • 举报
回复
class CTest { public: bool F1(int a, int b); }; bool CTest::F1(int a, int b) { if(a>b) return true; else return false; } typedef bool (CTest::*pf)(int ,int); pf fun1=CTest::F1; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. CTest *pTest=new CTest(); int t = 10; int h = 20; bool ret=(pTest->*fun1)(t, h); return 0; }
老夏 2021-04-23
  • 打赏
  • 举报
回复
类的成员函数实际上有个隐藏的参数指向this,所以提示实参与形参不兼容
Eleven 2021-04-22
  • 打赏
  • 举报
回复
把你类中定义的F1函数前面加个static
ZWW975 2021-04-22
  • 打赏
  • 举报
回复
Test(t, h, this->F1); 呢?
an_bachelor 2021-03-07
  • 打赏
  • 举报
回复
类的成员函数的指针,类型不一样,错误提示实际上已经说清楚了


// main.cc
#include <iostream>

class A {
public:
	A(int who) :i{ who } {};		
	~A() = default;

	void foo() {
		std::cout<<"I am object" << i << std::endl;
	}

	void caller(A* p, void( A::* lpFunc)()) {
		(p->*lpFunc)();
	}
	
	void test(){
		A b{2};
		caller(this, &A::foo);
		caller(&b, &A::foo);
	}
private:
	int i{ 0 };
};

int main(void){
	A a{1};
	a.test();
}
$ c++ main.cc && ./a I am object1 I am object2
zxphxh 2021-03-06
  • 打赏
  • 举报
回复
// 如果不定义类中,则没有问题
int T1(int a, int b)
{
return a+b;
}
int TF(int m, int n, int (*pT)(int,int))
{
return pT(m,n);
}
int GT()
{
return TF(10,20,T1);
}
c++城市公交查询系统 1.设有一文件对象in_file,若在while循环中用in_file>> 每次从文件中得到一个字符串直到文件结束, 如果用in_file直接来判断文件是否结束, 则文件末的那个字符串会得到两次。 而用文件in_file.eof()来判断则会得到正确的结果。 2.用delete []释放字符串空间时,老是有问题, 其中的原因之一是你原来申请的空间不够大, 后来往这个空间中放了过多的内容以至越界, 这时候会发生运行时的错误。 3.把一个对象作为参数传给另一个对象的成员函数时, 程序不能正常结束,即系统删除对象时有问题; 而使用指针或者引用传递参数时不仅不会出现问题, 而且可以人为的删除对象。 我个人认为这很有可能是值传递的原因, 当把一个对象作为实参传给一个函数时,函数形参拷贝了实参的值, 这时,如果对象有指针成员,那么形参的指针成员的值和 实参的指针成员的值将完全一样, 即它们指向的是同一块内存,所以当函数调用结束的时候, 函数的形参将会被系统撤消, 这时,形参调用析构函数,释放用new动态申请的内存。在函数的外面, 作为实参的对象的指针成员其实已经被撤消了,所以当程序结束, 系统撤消这个对象时,这个对象又要调用析构函数来释放指针成员, 但这时指针其实已经指向了非法的空间,导致出错。 bus 文件夹的内容记录的是每条线路的信息,对应于bus 类。 每个文件以线路名称(即车名,忽略前面的k)命名。 每个文件的内容组织如下:(共分为6行,以回车键作为行结束标志) 第一行为“线路名称:#### ”,其中####用具体的线路名称代替; 第二行为“上行站点:####”。 第三行为“下行站点:####”。 第四行为“首班车时间:####”。 第五行为“末班车时间:####”。 第六行为“票价:####”。 注:若不分“上行站点”和“下行站点”, 则第二行为“站点名称:####”, 第三行为空行;

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧