2014-04-21 3 views
2

저는 클래스 객체가 정수의 동적 배열 인 곳에서 연산자 함수를 작성하고 있습니다. 연산자는 lhs 및 rhs object를 가져 와서 rhs가 아닌 lhs의 요소 집합 인 객체를 반환합니다. 나는 기능을 작성했지만 소멸자는 객체가 반환 된 직후라고되어 있기 때문에 내가 집합을 반환 할 수없는 생각하지만연산자 함수에서 동적 객체를 반환하는 방법은 무엇입니까?

. 당신이 개체 당신은 값으로 결과를 반환하기 위해 변경해야

IntegerSet::IntegerSet(const int & size)//works correctly 
{ 
    capacity = size; 
    ptr = new int [capacity](); 
} 

IntegerSet::IntegerSet(const int & size)//works correctly 
{ 
capacity = size; 
ptr = new int [capacity](); 

} 

IntegerSet::IntegerSet(const IntegerSet & copy) : capacity(copy.capacity)//works correctly 
{ 

ptr = copy.clonemaker(); 
} 

IntegerSet::~IntegerSet() 
{ 
capacity = 0; 
delete [] ptr; 
} 


int * IntegerSet::clonemaker() const // works correctly 
{ 
if(ptr==NULL) 
{ 
    return NULL; 
} 

int *tempptr = new int [capacity]; 
for(int i=0;i<capacity;i++) 
{ 
    tempptr[i]=ptr[i]; 
} 

return tempptr; 

} 
+2

이진 산술 연산자는 값이 아닌 참조를 반환해야합니다. – juanchopanza

+0

참조로 반환하지 마십시오, 즉,'IntegerSet & IntegerSet이 : 운영자'해야'IntegerSet IntegerSet는 :: 연산자는-' – SirGuy

+0

@GuyGreer 덕분 일했다 ... :) 난 그냥 참조 및 const를 반환에 도입되었다 너무 혼란스러운 유형. – Astronautilus

답변

0

를 이해할 수없는 경우 여기를

IntegerSet & IntegerSet::operator - (IntegerSet & rhs) const 
{ 
    IntegerSet temp(capacity);//local object created to store the elements same size as lhs 

    int k=0; 
    int lhssize = ElementSize();//no. of elements in the set 
    int rhssize = rhs.ElementSize(); 

    for (int i=0;i<lhssize;i++) 
    { 
     for (int j=0;j<rhssize;j++) 
     { 
      if (rhs.ptr[j]!=ptr[i]) 
      { 
       k++; 
      } 
     } 

     if(k==rhssize) 
     { 
      temp = temp + ptr[i]; 
     } 
     k=0; 
    } 
    return temp; 
} 

생성자입니다. 제 모습을 촬영할 때

IntegerSet IntegerSet::operator - (IntegerSet & rhs) const 

또한 그것은 CONST 참조 우축 공급 더 나을.

4

당신은 값으로 반환해야합니다. 함수가 반환 될 때 로컬 객체가 파괴되고이를 방지 할 방법이 없습니다.

가 해결하기 위해

, 클래스가 올바르게 제대로 복사 가능한입니다 확인하기 위해 Rule of Three을 수행해야합니다. C++ 11 또는 이후 버전에서 불필요한 메모리 할당 및 복사를 피하기 위해 이동 가능하도록 고려할 수도 있습니다 (이 경우 복사는 생략되어야 함).

더 나은 규칙은 0의 규칙을 따르고 vector<int>을 저장하십시오. 원시 포인터를 저글링하는 대신이 모든 작업을 수행합니다.

+0

제안을 주셔서 감사합니다,하지만 내 과정에 대한 HW이기 때문에, 난 단지 배열이 아닌 데이터 컨테이너의 다른 양식을 사용하도록 제한하고 있습니다. – Astronautilus

+1

@Astronautilus : 좋습니다. 이 경우 소멸자, 복사 생성자 및 복사 할당 연산자를 잘 살펴보고 클래스를 복사 할 때 올바른 작업을 수행하도록하십시오. –

+0

그래 .. 만약 당신이 내 생성자, 복사 생성자 및 좋은 것입니다 소멸자를 확인할 수 있습니다. 나는 그들을 테스트했지만 잘 작동합니다. – Astronautilus

관련 문제