C++ 错误:无效使用非静态成员函数C++;
我有两个类需要链式调用(main->execute->calculate)。然而,问题是,当我使用:C++ 错误:无效使用非静态成员函数C++;,c++,function,class,C++,Function,Class,我有两个类需要链式调用(main->execute->calculate)。然而,问题是,当我使用: &calculate::addition; 即使编译器没有返回任何错误,也不会调用加法。如果我试图删除对的引用 calculate::addition; 编译器返回错误 error: invalid use of non-static member function ‘void calculate::addition(double&, double, double)’
&calculate::addition;
即使编译器没有返回任何错误,也不会调用加法。如果我试图删除对的引用
calculate::addition;
编译器返回错误
error: invalid use of non-static member function ‘void calculate::addition(double&, double, double)’
case 'a' : *calculate::addition; break;
^~~~~~~~
尝试在void之前使用static,结果与使用reference相同
#include <iostream>
class execute{
public:
void exec(char);
}jalan;
class calculate {
public:
void addition(double&, double, double);
void substraction(double&, double, double);
void multiply(double&, double, double);
void division(double&, double, double);
};
int main(void){
static double a, b;
static double result;
std::cout << "Type a, b, c, or d" << std::endl;
std::cout << "a. Addition\nb. Substraction\nc. Multiply\nd. Division" << std::endl;
std::cout << "Your Input: ";
static char option;
option = getchar();
std::cout << "First value: ";
std::cin >> a;
std::cout << "Next value: ";
std::cin >> b;
jalan.exec(option);
std::cout << result << std::endl;
return 0;
}
void execute::exec (char option){
switch(option){
case 'a' : &calculate::addition; break;
case 'b' : &calculate::substraction; break;
case 'c' : &calculate::multiply; break;
case 'd' : &calculate::division; break;
}
}
void calculate::addition(double& result, double a, double b){
result = a+b;
}
void calculate::substraction(double& result, double a, double b){
result = a-b;
}
void calculate::multiply(double& result, double a, double b){
result = a*b;
}
void calculate::division(double& result, double a, double b){
result = a/b;
}
#包括
类执行{
公众:
void exec(char);
}雅兰;
类计算{
公众:
加空(双加、双加、双加);
无效减法(double&,double,double);
无效乘法(双倍&,双倍,双倍);
无效分割(双重、双重、双重);
};
内部主(空){
静态双a、b;
静态双重结果;
std::cout您的代码中有几个问题。让我们开始:
这意味着您必须创建一个calculate实例,或使用static标记该方法,例如static void addition(double&,double,double);
所以把你的课改成
class calculate {
public:
static void addition(double&, double, double);
static void substraction(double&, double, double);
static void multiply(double&, double, double);
static void division(double&, double, double);
};
下一个问题是在switch语句中只创建指向函数的指针
void execute::exec (char option){
switch(option){
case 'a' : &calculate::addition; break;
case 'b' : &calculate::substraction; break;
case 'c' : &calculate::multiply; break;
case 'd' : &calculate::division; break;
}
}
这永远不会执行函数,只会创建一个函数指针,该指针会立即被丢弃
<> >为了使代码工作,请考虑此代码(请注意代码中的注释,解释所需的更改):
#包括
类执行
{
公众:
void exec(char,double&,double,double);
}雅兰;
类计算{
public://添加了static关键字,因此不需要创建类实例
静态空隙率增加(双倍、双倍、双倍);
静态空洞减法(双&,双,双);
静态空隙倍增(双倍、双倍、双倍);
静态空隙划分(双、双、双);
};
内部主(空){
静态双a、b;
静态双重结果;
要调用calculate类中的任何方法,必须先声明一个变量,然后调用该方法,例如:
calculate c;
double a,b,res;
c.addition(a,b,res);
或者将方法定义为静态函数,在这种情况下,调用将如下所示
calculate::addition(a,b,res);
为什么希望在&calculate::addition;
上调用该函数?您理解该语法的含义吗?它会创建一个函数指针(指向成员函数)事实上,整个代码看起来像是对C++有严重的误解——甚至不想把参数传递给你试图调用的函数<代码> Exc> <代码> @ UnholySheep。我想把选择的函数从Excel中返回,然后用“代码> A<代码/代码>、<代码> B<代码>和< Co调用它。de>result
.Op似乎还没有了解返回值(可能还不了解传递参数)
calculate c;
double a,b,res;
c.addition(a,b,res);
calculate::addition(a,b,res);