C++ 分配给类中函数指针的函数
我有一个处理多项式运算的程序。“operator”类有一个指向输入字符串的char指针,一个指向float(float,float)类型函数的指针,该函数用于对参数执行操作。然后有一系列方法,setSymb(char*)将opChar指向参数,并将opFunc指针指向与运算符字符对应的函数。但是,当我运行这个方法时,在它将函数分配给指针函数的那一行,new.cpp下有一个未处理的异常,当它尝试分配某种内存时。这让我很困惑C++ 分配给类中函数指针的函数,c++,class,function-pointers,C++,Class,Function Pointers,我有一个处理多项式运算的程序。“operator”类有一个指向输入字符串的char指针,一个指向float(float,float)类型函数的指针,该函数用于对参数执行操作。然后有一系列方法,setSymb(char*)将opChar指向参数,并将opFunc指针指向与运算符字符对应的函数。但是,当我运行这个方法时,在它将函数分配给指针函数的那一行,new.cpp下有一个未处理的异常,当它尝试分配某种内存时。这让我很困惑 #include "stckArrClassLib.h" using na
#include "stckArrClassLib.h"
using namespace stacks;
using namespace conversion;
#define SIDE bool
#define LEFT 0
#define RIGHT 1
class oprt
{
public:
typedef float (oprt::*fp)(float, float);
private:
char *opSymb;
fp opFunc;
float *lOpnd;
float *rOpnd;
oprt *Lnext;
oprt *Rnext;
float rslt;
protected:
float add(float a, float b){return a+b;};
float mult(float a, float b){return a*b;};
float div(float a, float b){return a/b;};
float exp(float a, float b){return powf(a, b);};
float par(float a, float b){return a;};
public:
oprt (void) {opFunc=NULL;};
oprt &setSymb(char *);
oprt &setNext(SIDE, oprt *);
oprt &setOpnd(SIDE, float);
float evaluate();
char *getSymb();
fp getFunc();
float *getOpnd(SIDE);
oprt *getNext(SIDE);
};
oprt& oprt::setSymb(char *set)
{
CArray<char, 8> opStr;
opStr[0]=*(set), set;
int i;
for(i=1; i<7 && (!(set[i]>='0' && set[i]<='9') && !(set[i]=='+' || set[i]=='-' || opStr[i]=='*' || set[i]=='/' || set[i]=='^' || set[i]=='(')); i++)
opStr[i]=set[i];
opStr[i]=0;
if(strcmp((const char *)opStr.arr, "+")==0)
//problem is here
opFunc=&oprt::add;
else if(strcmp((const char *)opStr.arr, "*")==0)
//and here
opFunc=&oprt::mult;
else if(strcmp((const char *)opStr.arr, "/")==0)
//etc.
opFunc=&oprt::div;
else if(strcmp((const char *)opStr.arr, "^")==0)
opFunc=&oprt::exp;
else if(strcmp((const char *)opStr.arr, "(")==0 || strcmp((const char *)opStr.arr, ")")==0)
opFunc=&oprt::par;
return *this;
}
oprt& oprt::setNext(SIDE side, oprt *next)
{
if(side==LEFT)
{
Lnext=next;
lOpnd=&(next->rslt);
}
else if(side==RIGHT)
{
Rnext=next;
rOpnd=&(next->rslt);
}
return *this;
}
float oprt::evaluate()
{
return rslt=(this->*opFunc)(*getOpnd(LEFT), *getOpnd(RIGHT));
}
char *oprt::getSymb()
{
return opSymb;
}
oprt::fp oprt::getFunc()
{
return opFunc;
}
float *oprt::getOpnd(SIDE side)
{
if(!((side==LEFT)? (Lnext==this):(Rnext==this)))
(side==LEFT? Lnext:Rnext)->evaluate();
return (side==LEFT)? (lOpnd):(rOpnd);
}
oprt *oprt::getNext(SIDE side)
{
return (side==LEFT)? (Lnext):(Rnext);
}
oprt& oprt::setOpnd(SIDE side, float set)
{
(side==LEFT)? (*lOpnd=set):(*rOpnd=set);
return *this;
}
调用malloc时会调用错误。我认为您必须将typedef修改为:
typedef float (oprt::*fp)(float, float);
在分配以下内容时,您也不希望使用“&”符号:
opFunc=&oprt::mult;
即使我这样做,它仍然失败。我尝试过多种使用typedef和全局函数的组合。我刚刚尝试过,结果很好,但我还必须删除getFunc(),因为您将它声明为函数指针,但随后您定义了它。你确定它就在那里坠毁了吗?怎么用?由于这些错误,它不应该编译,您使用的是什么编译器?我不完全确定。我使用VisualC++,但是在它试图将函数分配给OpFunc的时候,调试器弹出,并说NeX.CPP下有一个未处理的异常,以及它试图以某种原因分配内存的时刻。太离奇了,我离题了。我提到的问题是旧版本中的问题。但是,存在编译错误,调试器表示无法在分配点进行转换。特别是它不能从“float(uu thiscall oprt::*)(float,float)”转换为“oprt::fp”。您能用现在的代码编辑这篇文章吗?
opFunc=&oprt::mult;