修改esp32 idf hello_world_main.c,验证Strategy 策略基类。出现几个问题,加以解决:
错误:
…/main/hello_world_main.cpp: In function ‘void test01()’:
…/main/hello_world_main.cpp:77:12: error: deleting object of abstract class type ‘WeaponStrategy’ which has non-virtual destructor will cause undefined behavior [-Werror=delete-non-virtual-dtor]
delete ak47;
^~~~
…/main/hello_world_main.cpp:78:12: error: deleting object of abstract class type ‘WeaponStrategy’ which has non-virtual destructor will cause undefined behavior [-Werror=delete-non-virtual-dtor]
delete knife;
^~~~~
解决:
错误:
D:/Espressif/esp-idf-5.0/components/freertos/port/port_common.c:125: undefined reference to `app_main’
解决:
要在 void app_main(void)前加上extern “C”
extern “C” void app_main(void)
错误:
解决:
hello_world_main.cpp代码:
#include <stdio.h>
// #include “sdkconfig.h”
// #include “freertos/FreeRTOS.h”
// #include “freertos/task.h”
// #include “esp_system.h”
// #include “esp_spi_flash.h”
// #include <unistd.h>
// #include <stdlib.h>
// #include <string.h>
// #include <stdio.h>
// #include <errno.h>
// #include “string_test.h”
// 策略模式
// #include
// using namespace std;
// 抽象武器 策略基类(抽象的策略)
class WeaponStrategy
{
public:
virtual void UseWeapon() = 0;
};
// 具体的策略使用匕首作为武器
class Knife : public WeaponStrategy
{
public:
virtual void UseWeapon()
{
printf(“使用匕首\n”);
}
};
// 具体的策略使用AK47作为武器
class AK47 : public WeaponStrategy
{
public:
virtual void UseWeapon()
{
printf(“使用AK47\n”);
}
};
// 具体使用策略的角色
class Character
{
public:
WeaponStrategy *pWeapon;
void setWeapon(WeaponStrategy *pWeapon)
{
this->pWeapon = pWeapon;
}
void ThrowWeapon()
{
this->pWeapon->UseWeapon();
}
};
void test01()
{
Character *character = new Character;
WeaponStrategy *knife = new Knife;
WeaponStrategy *ak47 = new AK47;
// 用匕首当作武器
character->setWeapon(knife);
character->ThrowWeapon();
character->setWeapon(ak47);
character->ThrowWeapon();
// delete ak47;
// delete knife;
delete character;
}
extern “C” void app_main(void)
{
printf("Hello world!\n");
test01();
// /* Print chip information */
// esp_chip_info_t chip_info;
// esp_chip_info(&chip_info);
// printf("This is %s chip with %d CPU core(s), WiFi%s%s, ",
// CONFIG_IDF_TARGET,
// chip_info.cores,
// (chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
// (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");
// printf("silicon revision %d, ", chip_info.revision);
// printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024),
// (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");
// printf("Minimum free heap size: %d bytes\n", esp_get_minimum_free_heap_size());
// for (int i = 10; i >= 0; i--) {
// printf("Restarting in %d seconds...\n", i);
// vTaskDelay(1000 / portTICK_PERIOD_MS);
// }
// printf("Restarting now.\n");
// fflush(stdout);
// esp_restart();
}