2011-10-13 167 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的

相关问题