2011-10-13 40 views
3

作爲一個小項目,我做學習Qt的一部分,我想通過一個函數返回對象的數組。然後我想要正確地檢索這個數組並使用它的內容。現在,我只打印一對屬性值來嘗試並使其工作。在C++中,我想從一個函數返回一個對象數組,並用它在另一個

我遇到的問題是,當我嘗試打印其內容時,只有數組中的第一項保持正確的值(其餘似乎是隨機位模式)。

這裏是返回功能:

QLine* LinesData::getList(){ 

    QLine *lineList2[50]; 
    for(int i = 0; i < 50; i++){ 
     lineList2[i] = new QLine(10, 10 * i, 100, 100); 
    } 

return *lineList2;} 

這裏是試圖使用它的功能:

void runtimeWindow::drawAllLines(){ 
    QLine* lines = linesData.getList(); 
    for(int i = 0; i < 5; i++){ 
     qDebug() << lines[i].x1(); 
    } 
} 

回答

2

使用std::vectorstd:shared_ptr爲:

std::vector<std::shared_ptr<QLine> > LinesData::getList(){ 

    std::vector<std::shared_ptr<QLine> > lineList2; 
    for(int i = 0; i < 50; ++i){ 
     lineList2.push_back(new QLine(10, 10*i, 100, 100)); 
    } 

    return lineList2;} 

void runtimeWindow::drawAllLines(){ 
    std::vector<std::shared_ptr<QLine> > lines = linesData.getList(); 
    for(auto i = lines.begin(); i != lines.end(); ++i){ 
     qDebug() << (*i)->x1(); 
    } 
} 

如果你沒有在你的編譯器std::shared_ptr,使用升壓版本。

使用std::vector容器避免了與C風格相關的問題(例如緩衝區溢出),並且當您完成向量的內容以幫助防止內存泄漏時,std::shared_ptr會執行一種垃圾回收。

你也可以做到這一點沒有指針在所有執行以下操作:

std::vector<QLine> LinesData::getList(){ 

    std::vector<QLine> lineList2(50); 
    for(int i = 0; i < 50; ++i){ 
     lineList2[i].setLine(10, 10*i, 100, 100); 
    } 

    return lineList2;} 

,然後使用

void runtimeWindow::drawAllLines(){ 
    std::vector<QLine> lines = linesData.getList(); 
    for(auto i = lines.begin(); i != lines.end(); ++i){ 
     qDebug() << i->x1(); 
    } 
} 
+0

下半場比較好,比第一個建議好得多。 –

+0

@ Ben Voigt:我傾向於按照我想到的順序寫它。我想這隻意味着我想回想起來。 – andand

+0

第二部分效果很好!感謝所有的幫助。 – Paradoxyde

1

因爲我們還沒有分配的數據連續,你會不會能夠使用指針算術(其中包括數組下標運算符)來查找其他元素。

你也忘記釋放數據。這不是Java,內存不會釋放自己。

爲此,最好只使用​​。 Qt還提供了一些可以工作的容器。

+0

數據(QLine *)是連續的,他錯誤地引用lineList2。 – Ozan

+1

@Ozan:對象不是連續的。他有一個指針數組,而不是'QLine'數組。 –

+0

我以爲他打算在回答的最後一半返回數組 – Ozan

-1

使用

std::vector<QLine> 

new QLine[50] 

然後返回該指針。調用者負責釋放這個指針。

+0

-1。 –

+0

順便說一句,我認識你嗎?格倫伊格爾? –

0
QLine *lineList2[50]; 

lineList2是一個指針數組吸引他們。它們是連續的,但它們指向的存儲位置可能不是。所以,

return *lineList2; 

您正在返回序列中的引用第一個對象。但基於它的地址,您不能使用[]運算符訪問其他對象。究竟是什麼,你需要做的是 -

QLine** LinesData::getList(){ 
    // ..... 

    return lineList2; 
} 

void runtimeWindow::drawAllLines(){ 
    QLine** lines = linesData.getList(); 
    for(int i = 0; i < 5; i++){ 
     qDebug() << *(lines[i]).x1(); // or lines[i]->x1(); 
    } 
} 

或者乾脆用std::vector從所有這些痛苦遠離保持作爲@Ben建議。

0

您正在返回取消引用的lineList2,它是第一個可以通過行[0]訪問的QLine *指針。但是,行[1]等不是在數組上操作,而是第一個QLine *指針。

1:使用的容器,比如std :: vector的

第二:返回一個堆對象,並在同一時間將所有權轉移很容易出現內存泄漏時使用後調用函數不破壞對象。您可以修改的GetList(),因此,預計和填充的容器,而不是創建它的:

void LinesData::getQlines(std::vector<QLine>& lineList2) 
{ 
    for(int i = 0; i < 50; i++) 
     lineList2.push_back(QLine(10, 10*i, 100, 100)); 
} 

3:當你正在傳輸堆對象的所有權使用智能指針像shared_ptr的

相關問題