2016-11-29 39 views
0

我使用其中一種方法,這種方式聲明的第三方庫:在C++語言中,你如何創建一個新的對象,這是一個指向數組的指針?

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 ???;

而且,我不知道標題以及定義我的問題。如果你對標題有更好的想法,請糾正它。

謝謝!

+0

這是什麼語言?看起來不像C.嘗試看起來像C++,但它失敗了。 – DeiDei

+0

好的,你可能是對的。其實這是Arduino代碼,它是C/C++。 – papaiatis

+0

「一個新的對象是指向數組的指針」?對我沒有任何意義。 – dandan78

回答

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; 
}; 

再沒有newdelete要求:

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,沒有泄漏。

+0

這已經很棒了!我設法擺脫了很多編譯器錯誤,但是我正面臨着其他問題。請看我更新的問題。感謝您的幫助! – papaiatis

+1

我建議展示使用智能指針而不是「裸」'新''''刪除',C++ 11和所有...... – DevSolar

+1

@papaiatis:你應該真的關閉這個問題,並創建一個新的。無論如何,你不能將指向成員的指針轉換成指向函數的指針,它們可能看起來一樣但非常不同! – rodrigo

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++編譯器。您應該利用它來爲您編寫代碼。特別是,你應該讓編譯器爲構造函數生成代碼。

相關問題