Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 错误:无效使用非静态成员函数C++;_C++_Function_Class - Fatal编程技术网

C++ 错误:无效使用非静态成员函数C++;

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)’

我有两个类需要链式调用(main->execute->calculate)。然而,问题是,当我使用:

&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);