2010-12-04 4 views
0

다음과 같은 기능과 다중 번호가 쌍, 합리성 및 복합으로 상속되는 클래스 계층 구조가 있습니다. 이 모든 것은 Multinumber에서 가상 인 공유 기능입니다. 내 문제는 다음과 같은 코드입니다. 그것이 지금 쓰여지는 방식으로 newElement 변수는 Multinumber**setArray에 추가 될 때 범위를 벗어납니다.이 함수 내에서 메모리를 할당하는 방법을 찾아야합니다. 이상하게도 함수에 전달 된 매개 변수는 첫 줄에 인쇄 할 때도 항상 공백입니다. cout<<newElement->tostring(); 아무도 나에게 무엇이 잘못되었는지 말해 줄 수 있습니까?이 함수 내에서 메모리를 어떻게 할당합니까?

bool Set::addElement(Multinumber* newElement) 
{ 
    bool success = false; 
    if(isFull()) 
    { 
     resize(); 
    } 
    if(!isMember(newElement)) 
    { 
     setArray[numElements] = newElement; 
     numElements++; 
     success = true; 
    } 
    return success; 
} 

편집 : 포스터가 올바른지 예,이 메모리 문제가 std::vector<boost::shared_ptr<Multinumber>> setArray으로 Multinumber** setArray을 대체 방지하기 위해 숙제

+0

더 많은 코드가 필요합니다. 'Set' 클래스 전체를 게시하십시오. 'Multinumber'의 구현을 보는 것도 편리 할 것입니다. –

답변

0

현실적으로 (나는 숙제인데 your previous question에서 알 수 있습니다.) 자신의 세트를 구현하지 않았을 것입니다. 표준 라이브러리는 (C++ 0x를 사용하고 적절한 확장자를 가지고 있고 추가 기능보다 속도 우선 순위가 높은 경우) 요소를 순서대로 유지하려는 경우이 기능 (std::set)을 제공합니다.

스마트 포인터 클래스도 살펴 봐야합니다.

는 말했다 :

코드에서

, newElement이 범위를 벗어나려고하고 있지 않다. 호출 코드의 데이터에 대한 포인터가 주어 졌으므로 호출 코드가 뾰족한 것을 범위에서 벗어나게합니다.

As I responded 이전 질문에 대해서는 "virtual clone idiom"을 사용하여 사본을 만들어야합니다.

기본적으로 전달 된 유형의 유형이 무엇이든 new으로 전화를 걸고 복사가 이루어 지도록하려고합니다. "복사본이 만들어 졌는지"확인하려면 자연스럽게 복사 생성자를 new, 즉 new whatever(my_existing_whatever_instance)과 함께 사용하는 것이 가장 좋습니다. 그러나 C++에서는 생성자가 virtual이 될 수 없으므로 실제로 원하는 유형을 new 호출에 넣을 수는 없습니다. 대신 멤버 함수를 사용하여 위조해야합니다. 멤버 함수 virtual이 될 수 있기 때문에 clone은 실제 지정 대상에서 조회됩니다. 이는 new을 호출하여 자체 형식을 사용하고 자체 복사본 생성자를 호출하도록 구현되었습니다. 이 링크는 세부 정보를 제공합니다.

1

입니다.

0

성장이 필요하면 vector<Multinumber*> 유형으로 만들고 setArray.push_back (newElement)을 사용하십시오.

호출자가 벡터가 활성 상태 인 동안 요소를 활성 상태로 유지해야합니다. 그렇지 않다면 복제본을 반환하는 Multinumber에 가상 Clone 메서드를 추가합니다 (그리고 하위 클래스에서는이를 구현합니다). 그런 다음 push_back(newElement->Clone()).

+0

그가 벡터가 아닌 집합을 원한다고 가정합니다. 즉, 각 값 중 하나만 존재할 수있는 불변성을 적용합니다. 나는 이전 질문에 기초하여 숙제 용기를 구현해야한다고 추측한다. –

관련 문제