代码之家  ›  专栏  ›  技术社区  ›  Andy Votava

从父类定义调用学生方法

  •  0
  • Andy Votava  · 技术社区  · 1 年前

    我正在制作LCD菜单,但遇到了问题 lcdmenu (主菜单)和 submenu 相互作用

    class submenu;
    
    class lcdmenu
    {
    protected:
        command **commandlist;
        submenu **submenulist;
        ...   
    
    public:
        void setchildren(command **comlist, submenu **sublist, int comn, int subn);
        void render();
        ...
    
    };
    
    void lcdmenu::render(){
        lcd_clear();
        for (int line = 0; line < MAX_LINES; line ++){
            int index = menutop + line;
            ...
    
            if (index < numcommands){
                lcd_string(commandlist[index]->get_text());
                lcd_string(submenulist[index]->get_text()); 
            }
    
    class submenu : public lcdmenu {
    public:
        lcdmenu *parent;
        submenu(lcdmenu *par, const char* text);
    
        const char* get_text(){
            return text;
        }
    };
    
    submenu::submenu(lcdmenu *par, const char* text_):text(text_), parent(par)
    {
    }
    

    我正在传递一个列表 子菜单 实例到 lcdmenu.submenulist 变量,我想要 lcdmenu::render() 打电话 lcd_string(submenulist[index]->get_text()); 但我不能用 submenu.get_text 当该方法尚未定义时。

    有没有办法格式化我的文件,这样我就可以使用完全定义的 lcdmenu 类和 子菜单 相互之间的类?

    1 回复  |  直到 1 年前
        1
  •  0
  •   Remy Lebeau    1 年前

    在声明类方法之前,不能使用它。

    使用正向声明是解决类之间循环引用问题的正确方法。那么你为 lcdmenu::submenulist 成员(可能也适用于 lcdmenu::commandlist 成员)完全可以声明 lcdmenu

    但是,前瞻性声明无助于 lcdmenu::render() 方法它需要的完整声明 submenu 类,以便访问其成员,例如 submenu::get_text() 方法(与相同 command

    因此,您需要将声明和实现拆分为单独的 .h .cpp 帮助完成此任务的文件,例如:

    lcdmenu。h

    #ifndef lcdmenu_H
    #define lcdmenu_H
    
    class command;
    class submenu;
    
    class lcdmenu
    {
    protected:
        command **commandlist;
        submenu **submenulist;
        ...   
    
    public:
        void setchildren(command **comlist, submenu **sublist, int comn, int subn);
        void render();
        ...
    };
    
    #endif
    

    lcdmenu.cpp

    #include "lcdmenu.h"
    #include "submenu.h"
    #include "command.h"
    ...
    
    void lcdmenu::render(){
        lcd_clear();
        for (int line = 0; line < MAX_LINES; line ++){
            int index = menutop + line;
            ...
    
            if (index < numcommands){
                lcd_string(commandlist[index]->get_text());
                lcd_string(submenulist[index]->get_text()); 
            }
    

    子菜单。h

    #ifndef submenu_H
    #define submenu_H
    
    #include "lcdmenu.h"
    
    class submenu : public lcdmenu {
    public:
        lcdmenu *parent;
        submenu(lcdmenu *par, const char* text);
    
        const char* get_text();
    };
    
    #endif
    

    submenu.cpp

    #include "submenu.h"
    
    submenu::submenu(lcdmenu *par, const char* text_):text(text_), parent(par)
    {
    }
    
    const char* submenu::get_text(){
        return text;
    }
    

    命令h

    #ifndef command_H
    #define command_H
    
    ...
    
    class command ... {
    public:
        ...
        const char* get_text();
    };
    
    #endif
    

    命令.cpp

    #include "command.h"
    
    ...
    
    const char* command::get_text(){
        return ...;
    }
    

    现在,当您编译 lcdmenu.cpp ,编译器将在预处理器替换后看到以下代码:

    class command;
    class submenu;
    
    class lcdmenu
    {
    protected:
        command **commandlist;
        submenu **submenulist;
        ...   
    
    public:
        void setchildren(command **comlist, submenu **sublist, int comn, int subn);
        void render();
        ...
    };
    
    class submenu : public lcdmenu {
    public:
        lcdmenu *parent;
        submenu(lcdmenu *par, const char* text);
    
        const char* get_text();
    };
    
    ...
    class command ... {
    public:
        ...
        const char* get_text();
    };
    
    ...
    
    void lcdmenu::render(){
        lcd_clear();
        for (int line = 0; line < MAX_LINES; line ++){
            int index = menutop + line;
            ...
    
            if (index < numcommands){
                lcd_string(commandlist[index]->get_text());
                lcd_string(submenulist[index]->get_text()); 
            }
    

    当你编译 submenu.cpp ,编译器将在预处理器替换后看到以下代码:

    class command;
    class submenu;
    
    class lcdmenu
    {
    protected:
        command **commandlist;
        submenu **submenulist;
        ...   
    
    public:
        void setchildren(command **comlist, submenu **sublist, int comn, int subn);
        void render();
        ...
    };
    
    class submenu : public lcdmenu {
    public:
        lcdmenu *parent;
        submenu(lcdmenu *par, const char* text);
    
        const char* get_text();
    };
    
    submenu::submenu(lcdmenu *par, const char* text_):text(text_), parent(par)
    {
    }
    
    const char* submenu::get_text(){
        return text;
    }
    

    当你编译 command.cpp ,编译器将在预处理器替换后看到以下代码:

    ...
    
    class command ... {
    public:
        ...
        const char* get_text();
    };
    
    ...
    
    const char* command::get_text(){
        return ...;
    }