以成员函数为参数的结构

Posted

技术标签:

【中文标题】以成员函数为参数的结构【英文标题】:struct with member function as parameter 【发布时间】:2015-01-26 01:14:00 【问题描述】:

我是 C++ 和堆栈交换的初学者。我正在研究一个接口类,它获取键盘输入并通过循环遍历包含要比较的字符串和要输出的字符串的结构数组来检查它是否正确,具体取决于它是否等于比较字符串。如果输入正确,它将打印结构内的字符串,并调用结构内的一个函数并执行一些操作。

interface.hpp

#include <string>
class Input_Interface 
    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();

;

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

我知道 this 是通过类的成员函数传递的,但我不知道如何解决这个问题。我不确定问题是否出在结构对象内的范围解析运算符上,因为我可以在参数之外使用它就好了。

任何帮助将不胜感激。

【问题讨论】:

我仍然需要这方面的帮助。我将 bool stop_loop 放在定义它的类中,并且不能被静态方法调用。谢谢。 【参考方案1】:

你应该做如下所示的事情:

#include <string>
struct Input_Interface 
    struct command_output 
      std::string command;
      void (*output_function)();
    ;

    static void Clear();
    static void Quit_loop();
;

int main() 
    Input_Interface::command_output t = "CLEAR", Input_Interface::Clear;
    return 0;

Live example here

虽然我建议在函数指针上使用functor object。

【讨论】:

我可能应该把 stop_loop bool 放在开头。该 stop_loop bool 是在头文件内的 Interface 类中定义的,并且无法从静态方法中调用成员对象。 如果你能帮助我使用一个很棒的函数对象。我尝试使用 std::function 但我也无法让它工作。

以上是关于以成员函数为参数的结构的主要内容,如果未能解决你的问题,请参考以下文章

c++学习总结------类结构学习

通过成员为动态数组的函数初始化结构

在成员函数中调用成员结构

具有类私有成员和函数指针的继承结构

GroovyGroovy 方法调用 ( Groovy 构造函数中为成员赋值 | Groovy 函数的参数传递与键值对参数 | 完整代码示例 )

使用在内部结构定义中保存函数的类成员变量,这些函数将用作 unordered_map 对象的模板参数