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

时间:2017-04-05 09:56:26

标签: c++ data-structures function-pointers

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

我有一个结构的向量来存储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;
        }
    }
}

我想调用我的函数而没有instanciate Opcodes对象它是否可行?

编辑:

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

1 个答案:

答案 0 :(得分:1)

您的代码似乎正确,因此调试器信息可能会有所帮助。 但我们可以尝试使用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,请将回溯发送给我们。 此外,尝试使用基于范围的for,因为它不需要转换地图以再次获取元素(正如您在内部循环中所做的那样)

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来控制各种可能性。

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