C++ 在C++;,我想从一个函数返回一个对象数组,并在另一个函数中使用它

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

作为我学习Qt的一个小项目的一部分,我试图通过函数返回一个对象数组。然后我想正确地检索这个数组并使用它的内容。现在,我只打印一个属性的几个值,以尝试使其工作

我遇到的问题是,当我试图打印它的内容时,只有数组中的第一项保存正确的值(其余的似乎是随机位模式)

以下是返回函数:

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