2012-05-14 2 views
0

확장 및 함수 내의 배열에 새 개체를 추가하려면 해당 배열을 함수 외부에 영향을 미치려고합니다. 배열 포인터는 다음과 같이 보내집니다. 매개 변수).확장하고 새 개체를 함수 안에 배열에 추가하십시오.

void addMedia(Media* medias[], int &nrOfMedias, string title, int publYear, string author, int nrOfPages) 
{ 
    Media** tempArray = new Media*[nrOfMedias +1]; 
    for(int i = 0; i < nrOfMedias; i++) 
    { 
     tempArray[i] = medias[i]; 
    } 
    delete [] medias; 
    medias = tempArray; 
    delete [] tempArray; 
    medias[nrOfMedias] = new Book(title, publYear, author, nrOfPages); 
    nrOfMedias++; 
} 

이 코드는 함수 내부에서 훌륭하게 작동하지만, 배열 외부에있을 때 배열은 여전히 ​​비어 있습니다. 포인터가 함수 내부에서 변경 되었기 때문에 이것을 이해하지만 포인터를 변경하지 않고 배열을 확장 할 수 있습니까?

는 (필자는 리턴 데이터 유형 또는 매개 변수 할당 요구 사항을 변경할 수 없습니다.)

+1

벡터를 사용하여 참조로 전달하십시오. 훨씬 더 간단하고 안전합니다. (BTW, 거기에 두 번째 삭제 _yally 생선 보인다.) – Mat

+0

* 나는 반환 데이터 형식 또는 매개 변수를 변경할 수 없습니다 * 다음 그것은 ** 불가능 ** 당신이 원하는대로 할 수있어. – cnicutar

+0

그래,이 요구 사항을 보았 기 때문에 사용 벡터를 말한 대답을 삭제해야했다. – boiler96

답변

2

*medias = tempArray;medias = tempArray;을 변경 마십시오, 그것은 컴파일하게 연마 메모리 관리 (정말 해제해야하는지, 무엇을하지 고려).

+0

그 뜻이십니까? * medias = * tempArray; 이 코드로 작업하고 delete [] medias를 제거했습니다. 고마워. – Frozendragon

+0

아니, 롤리 답과 정확히 같은 * medias = tempArray를 의미합니다. – Greg

+0

에 오류가 있습니다. IntelliSense : "Media **"유형의 값을 "Media *"유형의 엔티티에 할당 할 수 없습니다. – Frozendragon

2

medias를 포인터의 배열로 보지 않고 배열의 포인터로 봅니다. 실제로 mediasmedias = tempArray;

함수가 그 라인 whithout 잘 작동합니다 후처럼 동일한 메모리 블록을 가리키는 delete [] tempArray;tempArray 때문에

class Media 
{ 
public: 
    Media() { m_strTitle = "unknown";} 
    string m_strTitle; 
}; 

class Book : public Media 
{ 
public: 
    Book(string strTitle) { m_strTitle = strTitle; } 
}; 

void addMedia(Media* medias[], int &nrOfMedias) 
{ 
    Media * tempArray = new Media[nrOfMedias +1]; 
    for(int i = 0; i < nrOfMedias; i++) 
    { 
     tempArray[i] = (*medias)[i]; 
    } 
    delete [] *medias; 
    (*medias) = tempArray; 

    (*medias)[nrOfMedias] = Book("newTitle"); 
    nrOfMedias++; 
} 

int main() 
{ 
    int numMedia = 10; 
    Media * myArray = new Media[numMedia]; 
    addMedia(&myArray, numMedia); 
    for (int i = 0; i < numMedia; i++) 
    { 
     cout << i << ") " << myArray[i].m_strTitle << endl; 
    } 

    return 0; 
} 
+0

Ok xx 코드는 한 가지 문제에 대해 잘 작동하는 것 같습니다. 아마 앞서 언급 했어야 만하지만 Media는 추상 클래스이므로 addMedia의 첫 번째 코드 줄에는 잘 들어 가지 않습니다. – Frozendragon

+0

그런 경우 함수 서명을 변경할 수 없으면 전달 된 medias 배열을 변경할 수 없다고 생각합니다. – Rollie

0

당신은 필요하지 않습니다하지만 난 가정 : (약간 간체) 예를 들어 작업 당신은 당신이 무엇을 건지 알고 있습니다. Media* medias[]

관련 문제