在C++语言中,如何创建一个指向数组的新对象?

问题描述 投票:0回答:3

我正在使用第三方库,其中的方法是这样声明的:

void nexLoop(NexTouch *nex_listen_list[]);

对于单个

.cpp
文件,此方法有效:

NexButton b0 = NexButton(0, 1, "b0");
NexTouch *nex_listen_list[] = 
{
    &b0,
    NULL
};
...
nexLoop(nex_listen_list);

完整的示例代码可以在这里看到:https://github.com/itead/ITEADLIB_Arduino_Nextion/blob/master/examples/CompText/CompText.ino

现在我将此库合并到一个具有单独头文件和 c 文件的类中,以便:

MyNextion.h

#include "Nextion.h"

class MyNextion {
   public:
       MyNextion();
       void loop();
   private: 
       NexButton *b0;
       NexTouch *nex_listen_list[];
}

MyNextion.cpp

#include "MyNextion.h"

MyNextion::MyNextion() {
    b0 = new NexButton(0, 1, "b0");
    nex_listen_list = new ???
}

MyNextion::loop() {
    nexLoop(nex_listen_list); // ???
}

我正在摆弄指针和地址运算符,但找不到成功编译的正确组合。

我的问题是:你会在这里放什么:

nex_listen_list = new ???;

另外,我不确定标题是否很好地定义了我的问题。如果您对标题有更好的想法请纠正。

谢谢!

c++ class oop pointers
3个回答
3
投票

不应声明没有大小的成员数组。相反,您可以声明一个指针到指针:

class MyNextion {
   ...
   private: 
       NexButton *b0;
       NexTouch **nex_listen_list;
};

然后施工就很简单了:

nex_listen_list = new NexTouch*[10];
nex_listen_list[0] = b0;
....

也就是说,

nex_listen_list
是指向
NexTouch
对象的指针的动态数组。完成后不要忘记
delete[]

delete[] nex_listen_list;

也就是说,如果数组的大小是恒定的,普通数组就可以了:

       NexButton *b0;
       NexTouch *nex_listen_list[3];

如果没有,我宁愿使用

std::vector
。比如:

class MyNextion {
   ...
   private: 
       NexButton *b0;
       std::vector<NexTouch*> nex_listen_list;
};

然后不需要

new
delete

nex_listen_list.push_back(b0);
nexLoop(nex_listen_list.data());

继续,您可以将

b0
声明为完整对象,而不是指针:

class MyNextion {
   ...
   private: 
       NexButton b0;
       std::vector<NexTouch*> nex_listen_list;
};
...
nex_listen_list.push_back(&b0); //use the pointer!

没有

new
,所以没有
delete
并且没有泄漏。


2
投票

如果

nex_listen_list
具有静态大小,您应该按值保留它:

// Interface
class MyNextion {
public:
   MyNextion() {}
   void loop();
private:
   NexButton b0{0, 1, "b0"};
   NexTouch *nex_listen_list[2] = {&b0, nullptr};
};

// Implementation
void MyNextion::loop() {
   nexLoop(nex_listen_list);
}

如果尺寸可变,您有两种选择。如果您不介意动态内存分配,请使用

std::vector
:

// Interface
class MyNextion {
public:
   MyNextion() {}
   void loop();
   void foo();
private:
   NexButton b0{0, 1, "b0"};
   NexButton b1{0, 2, "b1"};
   std::vector<NexTouch *> nex_listen_list{&b0, nullptr};
   void append(NexTouch *t);
};

// Implementation
void MyNextion::append(NexTouch *t) {
   nex_listen_list.back() = t;
   nex_listen_list.push_back(nullptr);
}

void MyNextion::foo() {
   append(&b1);
}

void MyNextion::loop() {
   nexLoop(nex_listen_list.data());
}

或者,您可以预先分配固定大小的列表并避免动态内存分配:

lass MyNextion {
public:
   MyNextion() {}
   void loop();
   void foo();
private:
   void append(NexTouch *);
   NexButton b0{0, 1, "b0"};
   NexButton b1{0, 2, "b1"};
   std::array<NexTouch *, 10> nex_listen_list{{&b0, nullptr}};
   std::array<NexTouch *, 10>::iterator it_el =
         std::find(nex_listen_list.begin(), nex_listen_list.end(), nullptr);
};

// Implementation
void MyNextion::append(NexTouch *t) {
   *it_el++ = t;
   *it_el++ = nullptr;
}

void MyNextion::foo() {
   append(&b1);
}

void MyNextion::loop() {
   nexLoop(nex_listen_list.data());
}

您获得了一个相当强大的 C++ 编译器。您应该利用它来为您编写代码。特别是,您应该让编译器生成构造函数的代码。


0
投票
I get error as below:

error: invalid use of non-static member function MyNextion::b0PopCallback(void*)

Could help me how solve? Thank you so much!!!


// Interface
class MyNextion {
public:
   MyNextion() {}
   void loop();
private:
   NexButton b0{0, 1, "b0"};
   NexTouch *nex_listen_list[2] = {&b0, nullptr};

   void b0PopCallback(void *ptr);

public:
   void MyFunToDoSomething(void);
};

MyNextion::MyNextion() {
   // Init NEXTION here.....

   // Then call this event press button b0
   b0.attachPop(b0PopCallback);
}

// Implementation
void MyNextion::loop() {
   nexLoop(nex_listen_list);
}

void MyNextion::MyFunToDoSomething(void) {
   // Do somthings...
}

void MyNextion::b0PopCallback(void *ptr) {
   MyFunToDoSomething();
}
© www.soinside.com 2019 - 2024. All rights reserved.