我有一个类,其中包含一些包含对象和动态指针数组的私有成员,我希望用这些指针填充指向某些成员对象的指针。
class NextionTest : public NextionDisplay {
private:
NexText lblText = NexText(0, 1, "t0");
NexButton btnPage1 = NexButton( 0, 2, "b0");
NexButton btnPage0 = NexButton( 1, 1, "b0");
NexTouch *nex_listen_list = [
&lblText,
&btnPage0,
&btnPage1,
NULL
];
/* rest of class not shown */
};
以上代码导致此错误:
捕获非变量'NextionTest :: lblText' &安培; lblText,
我尝试将nex_listen_list的初始化移动到init方法,但这会产生相同的结果。 我不知道捕获是什么......但似乎我做错了什么。 怎么解决这个问题?
答案 0 :(得分:0)
我建议使用std::vector
,它是动态的并且知道它的大小。
class NextionTest : public NextionDisplay {
private:
NexText lblText = NexText(0, 1, "t0");
NexButton btnPage1 = NexButton( 0, 2, "b0");
NexButton btnPage0 = NexButton( 1, 1, "b0");
std::vector<NexTouch*> nex_listen_list = {
&lblText,
&btnPage0,
&btnPage1};
/* rest of class not shown */
};
但是,如果复制或移动,此类的行为会很差。如果我做了
NextionTest n1;
auto n2 = n1;
n2.nex_listen_list
会指向n1
的数据成员,因此您应该删除副本并移动操作
class NextionTest : public NextionDisplay {
NextionTest(const NextionTest&) = delete;
NextionTest& operator=(const NextionTest&) = delete
//...
};
答案 1 :(得分:0)
您可以这样初始化阵列:
NexTouch* nex_listen_list[4] = {
&lblText,
&btnPage0,
&btnPage1,
nullptr
};
然而,这定义了一个固定大小的数组,看起来似乎是&#34; null-termination&#34;你的意图是拥有一个增长/收缩的动态数组,并且总是nullptr
与字符串类似地终止。在这种情况下,最好使用std::vector
:
std::vector<NexTouch*> nex_listen_list = {
&lblText,
&btnPage0,
&btnPage1,
nullptr
};
通常不需要nullptr-termination,但取决于你想对数组做什么。如果您将它发送到某个采用旧式数组的API,您可以使用nex_listen_list.data()
来检索嵌入式C风格的数组。