在声明类方法之前,不能使用它。
使用正向声明是解决类之间循环引用问题的正确方法。那么你为
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 ...;
}