gpt4 book ai didi

c++ - 崩溃 : When accessing vector from class

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:39:14 25 4
gpt4 key购买 nike

我正在编写 ESP32 UI 并遇到了这个问题:

我有一个 Menu 类,并在其标题中定义了一个 vector _menuItemStack。

我从外部创建一个 Object MenuItem 并将其传递给函数 addMenuItem(MenuItem menuItem)。它将它添加到堆栈中。哪个有效,当我在 Menu.cpp 中声明 vector 时它会运行。但是它不会对每个对象都是唯一的,我认为它变成了静态的?

所以我在 header 中将 vector 声明为私有(private),同时它会编译。它立即崩溃。

我的错误是什么? C++ 让我头疼。

Menu.h

    /*
Menu.h - Menu Class
*/
#ifndef Menu_h
#define Menu_h

#include "Arduino.h"
#include "StackArray.h"
#include "MenuItem.h"
#include "SPI.h"
#include "U8g2lib.h"

class Menu
{
public:
Menu();
void update();
void draw();
void addMenuItem(MenuItem menuItem);
private:
int arrayPos;
std::vector<MenuItem> _menuItemStack;
};

#endif

菜单.cpp

#include "Menu.h"
extern U8G2_SSD1327_MIDAS_128X128_2_4W_HW_SPI u8g2;

Menu::Menu() {
arrayPos = 0;
}

void Menu::draw() {

u8g2.setFont(u8g2_font_6x10_tf);

int posY = 0;

for (MenuItem &m : _menuItemStack){
u8g2.drawStr(0,posY+15,m.getText().c_str());
posY+=15;
}
}
void Menu::update() {

}

void Menu::addMenuItem(MenuItem menuItem){
arrayPos++;
_menuItemStack.push_back(menuItem);

//debug
Serial.println(arrayPos);
Serial.println(menuItem.getText());
}

注意:std::stdlib 包含在更高的位置。

编辑:

菜单项.cpp

#include "MenuItem.h"
extern U8G2_SSD1327_MIDAS_128X128_2_4W_HW_SPI u8g2;

MenuItem::MenuItem() {
_text = new String;
}

MenuItem::MenuItem(const MenuItem &obj){
_text = new String;
*_text = *obj._text;
}

void MenuItem::draw(){

}
void MenuItem::update(){

}

void MenuItem::setText(String txt){
*_text = txt;
}

String MenuItem::getText(){
return *_text;
}

void MenuItem::attachHandler(CallbackFunction f){
callback = f;
}

void MenuItem::run(){
if (callback != NULL) callback();
}

菜单项.h

#ifndef MenuItem_h
#define MenuItem_h

#include "Arduino.h"
#include "StackArray.h"
#include "SPI.h"
#include "U8g2lib.h"

class MenuItem
{
private:
typedef void (*CallbackFunction)();
CallbackFunction callback = NULL;
String *_text;
public:
MenuItem();
MenuItem(const MenuItem &obj);
void draw();
void update();
void run();
void setText(String txt);
void attachHandler(CallbackFunction f);
String getText();
};

#endif

最佳答案

传递给 addMenuItem 函数的 menuItem 是一个拷贝,其生命周期一直持续到该函数结束。

尝试传入菜单项作为引用,这样您的菜单项列表将填充生命周期长于 addMenuItem 函数的对象。将签名更改为如下所示:

void Menu::addMenuItem(MenuItem& menuItem)

关于c++ - 崩溃 : When accessing vector from class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55165803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com