|
发表于 2020-10-9 11:33:29
|
显示全部楼层
请教两个关于 C++的问题,也是困扰我两天的问题。
1、
此处 typedef 的函数指针定义为啥我不能放在类里面,图中第二个箭头所示的方向,放在里面就会报错,参见最下面一个箭头。
2、我在移植一个 shell 类的时候,涉及到函数指针的问题,本意上 shell 的命令都是通过 public 的外部函数进行添加,如下:
- void X_Shell::addCommand(const char *name, ShellFunctionT functionPoint)
- {
- strncpy(&this->_staticCommand[X_Shell::commandCount].commandName[0], name, sizeof(this->_staticCommand[X_Shell::commandCount].commandName));
- this->_staticCommand[X_Shell::commandCount].functionPoint = functionPoint;
- X_Shell::commandCount++;
- if (X_Shell::commandCount >= X_SHELL_MAX_CMD_COUNT)
- {
- this->_shellSerial->print("Too many commands has been added!\r\n");
- }
- }
复制代码
其中的结构体定义如下:
- typedef struct
- {
- char commandName[X_SHELL_CMD_NAME_MAX_LENGTH];
- void (*functionPoint)(char argc, char *argv);
- } CommandT;
复制代码
我为了内置一个保留命令,“ls”,所以将这个命令加入,
但是在构造函数中初始化的的时候一直报错,
- X_Shell::X_Shell(HardwareSerial &serial)
- {
- this->_shellSerial = &serial;
- strncpy(this->_shell.userName, X_SHELL_USER_NAME, sizeof(this->_shell.userName));
- strncpy(this->_staticCommand[0].commandName, "ls", sizeof(_staticCommand[0].commandName));
- this->_staticCommand[0].functionPoint = this->shellListCommand;
- this->_shell.command = &_staticCommand[0];
- }
复制代码
其中shellListCommand的定义如下:
- void X_Shell::shellListCommand(char argc, char *argv)
- {
- if (!strcmp("all", &argv[argv[1]]))
- {
- for (uint8_t i = 0; this->_staticCommand[i].functionPoint != NULL; i++)
- {
- this->_shellSerial->printf("%s\r\n", this->_staticCommand[i].commandName);
- }
- }
- else if (!strcmp("-v", &argv[argv[1]]))
- {
- this->_shellSerial->printf("%s\r\n", X_SHELL_VERSION);
- }
- else
- {
- this->_shellSerial->print("ls [options]\r\n");
- this->_shellSerial->print("options: \r\n");
- this->_shellSerial->print("\t -v \t: Show version\r\n");
- this->_shellSerial->print("\t all \t: show all commands\r\n");
- }
- }
复制代码
看到网上说涉及到类的函数指针,需要把成员函数声明为 static,这块也不是很理解,还是希望大神指点一下~
|
|