2011-10-13 2 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가 아니며 메모리는 자체 할당을 해제하지 않습니다.

std::vector<QLine>을 사용하는 것이 가장 좋습니다. Qt는 또한 작동 할 수있는 몇 가지 컨테이너를 제공합니다.

+0

데이터 (QLine *) contiguously, 그는 실수로 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를 사용합니다.

0

라인 [0]으로 액세스 할 수있는 첫 번째 QLine * 포인터 인 역 참조 된 lineList2를 반환합니다. 그러나 그 다음 줄 [1] 등은 배열에서 작동하지 않고 첫 번째 QLine * 포인터에서 작동합니다.

1 : 표준처럼 사용 컨테이너 : 벡터

2 : 호출 기능은 사용 후 오브젝트를 파괴하지 않는 경우 힙 객체를 반환 함과 동시에 소유권을 양도 메모리 누수하는 경향이있다. 그것을 기대하고 만드는 대신 컨테이너를 채 웁니다 있도록) 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의 같은 스마트 포인터를 사용

관련 문제