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

Posted

技术标签:

【中文标题】错误:非静态成员函数 C++ 的无效使用【英文标题】:error: invalid use of non-static member function C++ 【发布时间】:2018-09-13 12:15:49 【问题描述】:

我有两个要链式调用的类(主 -> 执行 -> 计算)。但是,问题是当我使用时:

&calculate::addition;

即使编译器没有返回任何错误,Addition 也不会被调用。如果我尝试删除对

的引用
calculate::addition;

编译器返回错误

error: invalid use of non-static member function ‘void calculate::addition(double&, double, double)’
     case 'a' : *calculate::addition; break;
                            ^~~~~~~~

在 void 之前尝试使用静态,结果与使用引用相同。

#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;   

【问题讨论】:

您为什么希望函数在&amp;calculate::addition; 上被调用?你明白这个语法是什么意思吗?它创建一个函数指针(指向一个成员函数)然后丢弃它。 事实上,整个代码看起来你对 C++ 有严重的误解——你甚至没有尝试将参数传递到你试图在 exec 中调用的函数中 @UnholySheep 我认为的目的是从 exec 返回选定的函数,然后用abresult 调用它。然而,Op 似乎没有了解返回值(并且可能不了解传递参数) 【参考方案1】:

您的代码中有几个问题。开始吧:

error: invalid use of non-static member function ‘void calculate::addition(double&, double, double)’
 case 'a' : *calculate::addition; break;

这意味着您必须创建一个计算实例或用 static void addition(double&amp;, 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;
       

这从不执行函数,而只会创建一个立即丢弃的函数指针。

为了让您的代码正常工作,请考虑以下代码(注意代码中的 cmets,它解释了所需的更改):

#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;   

希望这有助于理解您的问题。

【讨论】:

【参考方案2】:

要调用类计算中的任何方法,您必须先声明一个变量,然后调用该方法,例如:

calculate c;
double a,b,res;
c.addition(a,b,res);

或者您将方法定义为静态函数,在这种情况下调用将是这样的

calculate::addition(a,b,res);

【讨论】:

以上是关于错误:非静态成员函数 C++ 的无效使用的主要内容,如果未能解决你的问题,请参考以下文章

访问父类的成员“非静态数据成员的使用无效”C++

回调问题错误:非静态数据成员的使用无效

Linux - 信号:错误:非静态成员函数的使用无效

C++ 非静态成员函数的非法调用

使用boost bind时无效使用非静态成员函数 - c ++

visual C++中error C2352是啥意思