将成员对象的引用添加到指针数组

时间:2016-12-07 21:51:50

标签: c++

我有一个类,其中包含一些包含对象和动态指针数组的私有成员,我希望用这些指针填充指向某些成员对象的指针。

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方法,但这会产生相同的结果。 我不知道捕获是什么......但似乎我做错了什么。 怎么解决这个问题?

2 个答案:

答案 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风格的数组。