在没有对象参数错误的情况下调用非静态成员函数

时间:2014-11-27 16:00:22

标签: c++ class struct scope member-functions

任何人都可以解释为什么我收到此错误?

我正在研究一个接受类输入的接口类,并通过循环遍历包含要比较的字符串和输出字符串的结构数组来检查是否正确,这取决于它是否等于比较字符串。如果输入正确,它将在结构中打印字符串,并调用结构中的函数并执行某些操作。

interface.hpp

#include <string>
class Input_Interface {
public:
    struct command_output {
    std::string command;
    std::string success_string;
    std::string failure_string;
    void output_function();
    }

    bool stop_loop = false;
    void Clear();
    void Quit_loop();

private:
    std::string input_str;
};

interface.cpp

#include <iostream>
void Input_Interface::Quit_loop() {
   stop_loop = true;
   // ends loop and closes program
}

void Input_Interface::clear() {
   // does some action
}

Input_Interface::command_output clear_output{"CLEAR", "CLEARED", "", Input_Interface::Clear()};
Input_Interface::command_output quit_output{"QUIT", "GOODBYE", "", Input_Interface::Quit_loop()};
Input_Interface::command_output output_arr[]{clear_output, quit_output};

void Input_Interface::begin() {
while (stop_loop == false) {
    Input_Interface::get_input(); //stores input into var called input_str shown later
    this->compare_input();
    }
}

void Input_Interface::compare_input() {
for (unsigned int i=0; i<2; i++) {
    if (this->input_str == output_arr[i].command) {
        std::cout << output_arr[i].success_string << std::endl;
        output_arr[i].output_function();
        break;
        }
    }
    // ... goes through else for failure printing invalid if it did not match any of the command string in the command_output struct array

我的问题在于这些行

Input_Interface::command_output clear_output{"CLEAR", "CLEARED", "", Input_Interface::Clear()};
//error: call to non-static function without an object argument

Input_Interface::command_output quit_output{"QUIT", "GOODBYE", "", Input_Interface::Quit_loop()};
//error: call to non-static function without an object argument

我知道这个是通过班级的成员函数传递的,但我不知道如何解决这个问题。我不确定问题是否是结构对象中导致错误的范围解析运算符,因为我可以在结构外部使用它就好了。 Clear()和Quit()不能是静态的,因为它必须能够访问类中的对象。

1 个答案:

答案 0 :(得分:3)

如果我没有弄错的话,output_function中的struct command_output应该存储class Input_Interface的成员函数。

您需要更改此内容:

struct command_output {
    std::string command;
    std::string success_string;
    std::string failure_string;
    void output_function();
}

进入这个:

struct command_output {
    std::string command;
    std::string success_string;
    std::string failure_string;
    void (Input_Interface::*output_function)();
}

然后,更改初始化实例的方式:

Input_Interface::command_output clear_output{"CLEAR", "CLEARED", "", Input_Interface::Clear()};
Input_Interface::command_output quit_output{"QUIT", "GOODBYE", "", Input_Interface::Quit_loop()};

要:

Input_Interface::command_output clear_output{"CLEAR", "CLEARED", "", &Input_Interface::Clear};
Input_Interface::command_output quit_output{"QUIT", "GOODBYE", "", &Input_Interface::Quit_loop};

最后正确地调用它们,改变这个:

output_arr[i].output_function();

进入这个:

(this->*output_arr[i].output_function)();

错误来自于您撰写Input_Interface::Clear()Input_Interface::Quit_loop()的事实。

这种表示法意味着两件事:括号表示要对函数进行求值,结果传递给结构初始值设定项,这是不可能的,因为它们返回void并且这些函数被调用就好像它们是静态成员函数一样,事实并非如此。