2014-09-22 2 views
0

가방 컨테이너를 만들려고합니다. = 운영자에게 과부하가 걸려서 문제가 발생합니다. 이 헤더값으로 참조로 전달되는 매개 변수에서 길을 잃으십시오.

Zsak& Zsak::operator =(const Zsak& a) 
{ 
    (*this).V=a.V; 
    (*this).elemsz=a.elemsz; 
    return *this; 
} 

:

class Zsak 
{ 
public: 
    Zsak(){V=new Elem[100];} 
    Zsak (const Zsak & a) 
    { 
     *this=a; 
    } 
    Zsak(int meret) 
    { 
     V=new Elem[meret]; 
    } 
    ~Zsak(){delete[] V;} 
    Zsak& operator -(const Zsak& b); 
    Zsak& operator =(const Zsak& a); 
    void Zsak_Ba(int e); 
    void Zsak_Bol(int e); 
    bool Uress(); 
    int E_Hany(int e) const; 
    friend std::ostream& operator << (std::ostream& out,const Zsak& z); 
private: 
    Elem *V; 
    int elemsz=0; 

}; 

Zsak_Ba는 가방에 요소를 둔다;

Zsak_Bol은 가방에서 요소를 꺼냅니다.

테스트를 통해 관찰 한 결과 의 주소는 *this의 주소로 식별됩니다.

1 2 
2 3 
4 1 

1 2 
2 3 
4 1 

그리고 무엇 정말 인쇄해야하는 것은 :

1 3 
2 3 
4 1 

1 2 
2 3 
4 1 

내가이를 얻기 위해 무엇을해야 이러한 맥락

Zsak z(5),c(5); 
z.Zsak_Ba(1); 
z.Zsak_Ba(1); 
z.Zsak_Ba(1); 
z.Zsak_Ba(2); 
z.Zsak_Ba(2); 
z.Zsak_Ba(2); 
z.Zsak_Ba(4); 
Zsak d=z; 
d.Zsak_Bol(1); 
cout<<z<<endl<<d; 

그것은 인쇄와

? 내가 뭘 잘못하고있어? 그리고 왜?

고맙습니다.

+2

여기에 포인터 만 복사하고 있습니다 :'(* this) .V = a.V;'. 이제 두 개의 객체가 동일한 데이터를 가리 킵니다. – juanchopanza

+0

그리고 이것을 제거하려면 어떻게해야합니까? – Iero

+0

RHS 객체가 가리키는 배열의 모든 요소를 ​​LHS 객체가 가리키는 배열의 요소에 할당합니다. – juanchopanza

답변

0

할당 연산자에서 포인터 만 복사하고 내용은 복사하지 않습니다.

Zsak& Zsak::operator =(const Zsak& a) 
{ 
    if (this == &a) { // or std::addressof(a) 
    return *this; 
    } 

    delete[] V; 

    elemsz=a.elemsz; 
    V=new Elem[elemsz]; 
    for (std::size_t i = 0; i < elemsz; ++i) { 
    V[i] = a.V[i]; 
    } 
    return *this; 
} 

또한 elemsz이 (멤버 초기화 외부에서) 업데이트되는 위치를 볼 수 없습니다. 나는 그것이 생성자에있을 것이라고 상상할 것이다.

Zsak(int meret) 
{ 
    V=new Elem[meret]; 
    elemsz = meret; 
} 

그리고

Zsak() 
{ 
    V=new Elem[100]; 
    elemsz = 100; 
} 

또한 종종 "복사 스왑은"할당 연산자와 복사 생성자에서 전체 사본을 (구현하는 데 사용됩니다 협조 할 수 있습니다 기본적으로 다른 방법 당신이 가지고있는 것에서 주위에). 그것은 필요한 경우 자동으로 할당에, 자기 할당을위한 시험이 추가 할 수 있습니다 일부 오버 헤드가 발생

Zsak (const Zsak & a) : elemsz(a.elemsz) 
{ 
    V = new Elem[elemsz]; 
    for (int i = 0; i < elemsz; ++i) { // copy the contents 
    V[i] = a.V[i]; 
    } 
} 

Zsak& Zsak::operator =(const Zsak& a) 
{ 
    Zsak temp(a); 
    std::swap(this->elemsz, temp.elemsz); 
    std::swap(this->V, temp.V); 
    return *this; 
} 

처럼

"복사 스왑은"보일 것이다.

동적 메모리를 사용하고 구현하는 작업 인 것을 이해하면 Elem 어레이와 그 관리를 기본 클래스 외부에서 다시 고려하는 것이 가장 좋습니다. 일반적으로 발생하는 버그와 문제를 유지하고 수정하는 것이 일반적으로 더 쉽습니다.

+0

@ Niall 해체가 호출 될 때'V = new Elem [elemsz]'가 삭제 될 것입니까? 나는 여기에'elemsz'를 설정했다 :'private : Elem * V; int elemsz = 0;'이 일을 하는게 좋지 않니? – Iero

+1

@lero, 예,'delete []'가 소멸자에서 호출됩니다. 'elemsz'를 설정하는 것은 좋은 생각이지만,'V'에서 메모리를 할당 할 때 업데이트해야합니다. – Niall

+0

고마워요! 나는이 코드를 몇 시간 동안보고 있었다 ... 다시 한번 감사드립니다! – Iero

0

수동 동적 메모리 대신 vector<Elem>을 사용하는 경우 사용자 정의 복사 생성자 또는 할당 연산자가 필요하지 않습니다. 그것은 효과가있을 것입니다. 이것이 바람직한 해결책입니다. C++이 당신을 위해 일하게하십시오.

+1

나는 이것을 알고있다 ... 그러나 이것은 업무이다 : 나는 그것을 동적으로해야만한다. – Iero

관련 문제