gpt4 book ai didi

c++ - 构建对象数组是如何工作的?我坚持这个例子

转载 作者:行者123 更新时间:2023-11-30 01:34:04 27 4
gpt4 key购买 nike

我正在尝试理解一些用于 ESP32 EPaper 模块 (TTGO T5 V2.2) 的代码。当三个按钮之一被按下时,该程序使用 Button2 库来处理事件。它为每个按钮初始化一个对象并将其存储在一个指针数组中。当我想编译代码时,出现以下错误:

error: no matching function for call to 'Button2::Button2()'

(信息:Button2 *pBtns = nullptr;args = 3;)错误发生的代码行是:

pBtns = new Button2 [args];

到目前为止我明白,这一行是否应该为那个新对象保留堆上的内存。那么为什么要有一个函数,它的目的是什么?

到目前为止,我尝试使用固定的数组大小并使用来自互联网某处的一些示例的代码片段:

//Button2 pBtns[5] = {nullptr,nullptr,nullptr,nullptr,nullptr};
//Button2 pBtns[5];
//Button2* pBtns = static_cast<Button2*>( ::operator new ( sizeof(Button2) * (sizeof(g_btns) / sizeof(g_btns[0]))));
// g_btns[] is the array of gpio pins of the buttons

由于缺少示例,我仍然不知道我是否遗漏了什么,但是“没有匹配的调用函数”错误提示对象本身存在问题,如果我没记错的话 ...

// in Button2.h:

class Button2 {
private:
.// some private defs ...
public:
Button2(byte attachTo, byte buttonMode = INPUT_PULLUP, unsigned int debounceTimeout = DEBOUNCE_MS);
.// some methods here ...
bool operator==(Button2 &rhs);

void loop();
};


// in program code:

#define BUTTONS_MAP {37,38,39}

Button2 *pBtns = nullptr;
uint8_t g_btns[] = BUTTONS_MAP;

void button_init()
{
uint8_t args = sizeof(g_btns) / sizeof(g_btns[0]);
pBtns = new Button2 [args]; //<<<<<<< COMPILER-ERROR is HERE
//pBtns = new Button2;
for (int i = 0; i < args; ++i) {
pBtns[i] = Button2(g_btns[i]);
pBtns[i].setPressedHandler(button_callback);
}
}

在上面的示例中,我希望 pBtns 包含一个数组,其中包含 3 个指向新创建和初始化对象的指针。另外我想知道错误消息中提到的功能是什么。我喜欢将对象存储在数组中的想法,并想在我自己的开发中使用它,当我理解了原理并实践了 - 那么这种技术的优缺点是什么?

(长文本的 sri - 只是还不知道什么是相关的,所以拉动我的大脑!)

最佳答案

分配数组时,程序将尝试默认构造元素。

您不能默认构造 Button2,因为定义另一个构造函数会禁用自动生成的默认构造函数。您需要添加默认构造函数或移至 a smarter container like std::vector .

例子:

Button2 *pBtns = nullptr;

成为

std::vector<Button2> btns;

然后后面的按钮在 vector 中用

创建
btns.emplace_back(<arguments>);

作为额外的好处,vector 消除了动态分配的数组给您带来的所有内存管理工作。

关于c++ - 构建对象数组是如何工作的?我坚持这个例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56943050/

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