簡體   English   中英

如何將函數分配給函數指針?

[英]How to assign functions to a function pointer?

我正在編寫一個 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 中,例如我想轉換為函數指針的函數之一,以便分配給結構指令的字段。 所以我有這個代碼:

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

目標是從內存中獲取操作碼,然后使用該操作碼從映射中檢索有關相關指令的信息,最后通過使用 switch case 選擇正確的來執行其功能:

    ((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);

我該如何解決它以及它為什么會發生? 謝謝

&Cpu::add_A_n返回一個指向成員函數指針,這與普通的函數指針有很大的不同,兩者不能混用。 指向成員函數的指針的奇怪之處在於,非靜態成員函數都需要一個this實例才能調用該函數。

在您的情況下,如果像add_A_n這樣的函數真的不依賴於this ,只需將其add_A_n static或非成員函數:

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

這樣,就不再需要調用this了, &Cpu::add_A_n就變成了普通的函數指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM