我有两个要链调用的类(主 -> 执行 -> 计算)。但是,问题是当我使用:
&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 ,结果与使用引用相同。
#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;
}
您的代码中有几个问题。开始吧:
error: invalid use of non-static member function ‘void calculate::addition(double&, double, double)’ case 'a' : *calculate::addition; break;
这意味着您必须创建一个计算实例或使用静态标记该方法,例如 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;
}
}
这永远不会执行函数,而只会创建一个立即丢弃的函数指针。
为了让您的代码工作,请考虑以下代码(注意代码中的注释,其中解释了所需的更改):
#include <iostream>
class execute
{
public:
void exec(char, double&, double, double);
}jalan;
class calculate {
public: // added static keyword so you do not need to create a class instance
static void addition(double&, double, double);
static void substraction(double&, double, double);
static void multiply(double&, double, double);
static 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. Subtraction\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, result, a, b); // you need to pass the arguments which you want to use and modify
std::cout << result << std::endl;
return 0;
}
void execute::exec (char option, double& res, double a, double b){
switch(option){ // changed the function pointers to actual calls to the functions
case 'a' : calculate::addition(res, a, b); break;
case 'b' : calculate::substraction(res, a, b); break;
case 'c' : calculate::multiply(res, a, b); break;
case 'd' : calculate::division(res, a, b); 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;
}
希望这有助于理解您的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句