C++ 在C++;,我想从一个函数返回一个对象数组,并在另一个函数中使用它
作为我学习Qt的一个小项目的一部分,我试图通过函数返回一个对象数组。然后我想正确地检索这个数组并使用它的内容。现在,我只打印一个属性的几个值,以尝试使其工作 我遇到的问题是,当我试图打印它的内容时,只有数组中的第一项保存正确的值(其余的似乎是随机位模式) 以下是返回函数:C++ 在C++;,我想从一个函数返回一个对象数组,并在另一个函数中使用它,c++,arrays,qt,object,C++,Arrays,Qt,Object,作为我学习Qt的一个小项目的一部分,我试图通过函数返回一个对象数组。然后我想正确地检索这个数组并使用它的内容。现在,我只打印一个属性的几个值,以尝试使其工作 我遇到的问题是,当我试图打印它的内容时,只有数组中的第一项保存正确的值(其余的似乎是随机位模式) 以下是返回函数: QLine* LinesData::getList(){ QLine *lineList2[50]; for(int i = 0; i < 50; i++){ lineList2[i] = new
QLine* LinesData::getList(){
QLine *lineList2[50];
for(int i = 0; i < 50; i++){
lineList2[i] = new QLine(10, 10 * i, 100, 100);
}
return *lineList2;}
QLine*LinesData::getList(){
QLine*lineList2[50];
对于(int i=0;i<50;i++){
lineList2[i]=新QLine(10,10*i,100100);
}
return*lineList2;}
下面是尝试使用它的函数:
void runtimeWindow::drawAllLines(){
QLine* lines = linesData.getList();
for(int i = 0; i < 5; i++){
qDebug() << lines[i].x1();
}
}
void runtimeWindow::drawAllLines(){
QLine*lines=linesData.getList();
对于(int i=0;i<5;i++){
qDebug()由于没有连续分配数据,因此无法使用指针算法(包括数组下标运算符)查找其他元素
您还忘记了释放数据。这不是Java,内存不会自行释放
最好只使用std::vector
。Qt还提供了一些可以工作的容器。使用
std::vector<QLine>
然后返回该指针。调用者负责释放该指针。使用std::vector
和std:shared\u 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<QLine> lines = linesData.getList();
for(auto i = lines.begin(); i != lines.end(); ++i){
qDebug() << i->x1();
}
}
void runtimeWindow::drawAllLines(){
std::vector lines=linesData.getList();
对于(自动i=lines.begin();i!=lines.end();+i){
qDebug()x1();
}
}
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();
}
}
QLine**LinesData::getList(){
// .....
返回行列表2;
}
void runtimeWindow::drawAllLines(){
QLine**lines=linesData.getList();
对于(int i=0;i<5;i++){
qDebug()x1();
}
}
或者简单地使用@Ben建议的避免所有这些痛苦的std::vector
。
第一:使用容器,比如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));
}
void LinesData::getqline(std::vector和lineList2)
{
对于(int i=0;i<50;i++)
lineList2.向后推(QLine(10,10*i,100100));
}
第三:当您使用诸如shared_ptr之类的智能指针转移堆对象的所有权时,顺便问一下,我认识您吗?Gleneagle?数据(QLine*)是连续的,他错误地取消了对lineList2的引用。@Ozan:对象不是连续的。他有一个指针数组,而不是一个QLine
数组。我以为他打算返回数组@Ben Voigt:我倾向于按我想的顺序写。我想这只是意味着我想向后看。值得注意的是,他已经在使用Qt了。因此,QList似乎是一个逻辑选择(因为它也已经被隐式共享了等等)。只需为beauty键入typename:typedef std::sharedptrqlineptr;您就可以在Qt中使用QList和QSharedPointer。
QLine *lineList2[50];
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();
}
}
void LinesData::getQlines(std::vector<QLine>& lineList2)
{
for(int i = 0; i < 50; i++)
lineList2.push_back(QLine(10, 10*i, 100, 100));
}