如何将函数分配给函数指针?

时间:2019-03-22 20:02:48

标签: c++ c++11

我正在编码Gameboy模拟器,并且出于CPU的指示,我在此处(cpp.hpp中)使用此结构来存储有关它们的信息。该地图用于通过与其个人操作码相同的键来访问所有这些信息:

    struct instruction {
        std::string name;    //name of the instruction
        int cycles;          //clock cycles required to be executed
        int paramNum;        //number of params accepted
        void* function;      //code to be executed
    };
    class Cpu {
        private:
            std::map<unsigned char, instruction> instrMap;
            void Cpu::fillInstructions(void);
            instruction addInstruction(std::string, int, int, void*);
        public:
            void add_A_n(unsigned char);
    }

然后在cpu.cpp中,例如,我具有要转换为函数指针的函数之一,以便分配给struct指令的字段。所以我有这段代码:

    void Cpu::add_A_n(unsigned char n) {
        //body     
    }
    void Cpu::addInstructions(std::string name, int cycles, int paramNum, void* function) {
        instruction i = {name, cycles, paramNum, function};
        return i;
    }
    void Cpu::fillInstructions() {
        instrMap[0x80] = Cpu::addInstruction("ADD A, n", 4, 0, (void*)&Cpu::add_A_n);
    }

目标是从内存中获取操作码,然后使用此操作码从映射中检索有关相对指令的信息,最后通过使用切换条件选择正确的指令来执行其功能:

    ((void (*)(void))instrMap[0x80].function)(); //for 0 params
    ((void (*)(unsigned char))instrMap[0x90].function)((unsigned char)operand); //for 1 param

我的目标是将所有函数(甚至需要一些参数的函数)都转换为结构体中的一个。

它的相应功能已正确执行,但发出警告:

警告:从'void(Cpu :: )()'转换为'void '[-Wpmf-conversions]      instrMap [0x80] = Cpu :: addInstruction(“ ADD A,n”,4,0,(void *)&Cpu :: add_A_n);

我该如何解决?为什么会发生?谢谢

1 个答案:

答案 0 :(得分:2)

&Cpu::add_A_n返回一个pointer to a member function,它与普通的函数指针有很大的不同,并且不能将两者混合使用。围绕成员函数指针的怪异之处是,非静态成员函数都需要一个this实例才能调用该函数。

对于您来说,如果像add_A_n这样的函数确实不依赖于this,只需使其成为static或非成员函数即可:

class Cpu {
    ...
    static add_A_n(unsigned char);
};

这样,它不再需要调用this,并且&Cpu::add_A_n成为普通的函数指针。