c++ - 通过指针调用静态成员函数

标签 c++ data-structures function-pointers

我正在开发一个小型自定义汇编程序

我有一个结构 vector 来存储 OPCODE 信息(助记符、参数的数量和类型、解析函数,...)

typedef char    args_type_t;

typedef struct  op_s {
    std::string     opcode;
    char            nbr_args;
    args_type_t     type[4];
    int             code;
    Tryte           (*fct)(std::vector<std::string>);
} op_t;

解析函数是指向静态成员函数的指针:

{"MOV", 2, {T_REGISTER | T_ADDRESS, T_REGISTER | T_ADDRESS | T_CONSTANT}, 1, &Opcodes::MOV},

和功能:

class Opcodes
{
public:
    static Tryte Opcodes::MOV(std::vector<std::string> _opMap) {
        return Tryte(0);
    }
};

我尝试了这个,但是我得到了 SEGFAULT(str() 是 Tryte 的成员函数):

for (int i = 0; i < opMap.size(); i++) {
    for (int j = 0; j < op_tab.size(); j++) {
        if (!op_tab[j].opcode.compare(opMap[i][2])) {
            std::cout << "OPBYTE : " << op_tab[j].fct(opMap[i]).str() << std::endl;
        }
    }
}

我想在没有实例化 Opcodes 对象的情况下调用我的函数,这是可行的吗?

编辑:

我的错误在这里:if (!op_tab[j].opcode.compare(opMap[i][2])) 我的助记词是opMap的第一项

最佳答案

您的代码似乎是正确的,因此也许调试器信息会有所帮助。 但是我们可以尝试通过使用 std::function 来提高代码的友好性:

typedef char    args_type_t;

#include <functional>
typedef struct  op_s {
    std::string     opcode;
    char            nbr_args;
    args_type_t     type[4];
    int             code;
    std::function<Tryte(std::vector<std::string>>)>  fct;
} op_t;

至于 sefgault,请向我们发送回溯。 另外,尝试使用 range-based-for 因为它不需要遍历 map 来再次获取元素(就像你在内循环中所做的那样)

for (auto op : opMap) {
    for (auto tab : op_tab) {
        if (!tab.opcode.compare(op[1])) {
            std::cout << "OPBYTE : " << tab.fct(op).str() << std::endl;
        }
    }
}

为了不再错过索引,您可以采取的一种常见修复方法是使用一个包含可能性的枚举。

enum Columns {
    FuncPointer,
    UserData
}

for (auto op : opMap) {
    for (auto tab : op_tab) {
        if (!tab.opcode.compare(op[FuncPointer])) {
            std::cout << "OPBYTE : " << tab.fct(op).str() << std::endl;
        }
    }
}

关于c++ - 通过指针调用静态成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43227821/

相关文章:

c - 函数和函数指针声明的宏?

c++ - 推导可变参数模板参数失败?

c++ - Borland C++ 异常

c++ - 结束时控制台崩溃(循环)未超出范围错误

c++ - 是否允许在 JSON 文件中对 boost read_json 进行注释?

python - 在排序和旋转的数组中找到最小元素

c++ - 我想我需要一个带键的链表结构。有什么建议么?

c# - 在 C# 中将 PInvoke 与函数指针和委托(delegate)一起使用

c++ - 数组 :/有问题

c++ - 在 Windows API 中检查文件大小的规范方法?