2011-08-30 9 views
0

object1 = object2;을 입력하면 object2의 모든 값을 object1에 복사하도록 = 연산자를 오버로드하는 함수를 만들어야합니다.과부하 연산자 =

내 클래스는 다음과 같습니다

class foo { 
    private: 
    int max; 
    int *val; 
    size_t *listofVal; 
} 

그리고 내 과부하 함수는 다음과 같이 선언한다 :

foo& foo::operator=(const foo& matrix); 

foo::foo(std::istream& s); //constructor 

가 어떻게 이런 짓을 했을까? "C++ 할당 연산자"에 대한 인터넷 검색을

+2

이것은 숙제와 같습니다. 당신은 이미 무엇을 시도 했습니까? –

+0

@sasha'private' 변수를'mutable'으로 만들려고했지만 꽤 추한 것 같습니다. – SNpn

+0

SNpn : 오버로드 된 연산자는'foo' 클래스의 멤버이므로 private 멤버 데이터에 액세스 할 수 있습니다. – razlebe

답변

-1

당신에게 제공 ;-)

+5

링크는 일반적으로 SO에 대한 좋은 대답으로 간주되지 않습니다. –

+0

그런 대답은 유용하지 않다고 생각합니다. 웹에서 많은 "나쁜 교사"를 찾을 수 있습니다. 그렇기 때문에 사람들이이 웹 사이트에 질문을 올리는 이유입니다. –

+0

나는이 주제를 인터넷 에서뿐만 아니라 책에서도 연구 할 수 있다고 생각합니다. 그 이유는 방금 링크를 게시 한 이유입니다. 나는 미래에 그렇게하지 않을 것입니다. –

1

this useful site 단순히 컴파일러 제공 복사 생성자의 기본 동작은 모든 값입니다 복사. 이를 "얕은 복사본"이라고합니다.

참조에서 가리키는 개체 (여기 값)가 복사본에 새로 만들어 지도록 고유 한 생성자를 구현하면 더욱 정교한 동작을 얻을 수 있습니다.

foo::foo(std::istream& s) { 
    max = s.max; 
    val = new int; 
    *val = s->val; 
    listofVal = new size_t; 
    *listofVal = s->listofVal; 
} 

은 "딥 카피 (deep copy)"로 알려진 것을 달성하는 한 가지 방법입니다.

회원 중 한 명이 listofVal이라고 말하면서 나는 그것이 가리키는 메모리 주소에 하나의 값을 저장하는 것 이외의 다른 것을하고 있다고 느낍니다.이 경우, 그 안에 들어있는 요소의 수에 대한 카운터를 알아야합니다. 나는 앞으로 당신이 max라고 부르는 분야라고 가정 할 것입니다. 전체 목록을 복사하려면 복사 생성자는 할 필요가 :

foo::foo(std::istream& s) { 
    max = s.max; 
    val = new int; 
    *val = s->val; 
    listofVal = new size_t[max]; 
    for (int i = 0; i < max; ++i) 
     listofVal[i] = s->listofVal[i]; 
} 

라비는, 그래, 복사 생성자는 다른 두 전에 구현 될 수있는 구조의하고 "세 가지의 규칙을"파괴에도 불구하고 증거입니다 . 다음은 대입 연산자입니다.

object1 = object2; 할당에 적합합니다. 필자는 복사 생성자 접근 방식을 선호합니다.

방법은 클래스가 소멸자를 필요로하지만, 명시 적으로 요청하지 않은 것처럼 내가 년후 무엇을 대답하고 싶지 않았다 물론

class foo { 
    ///...///As before 
    foo &operator=(const foo& matrix); 
}; 

같이해야하므로 개인 데이터에 액세스 할 수있는 구성원이 될 필요가 '물었다.

당신이 고려해 볼 수 있습니다 강력한 할당에 대한 LHS 이미 데이터를 포함 할 수 복사 및 스왑 관용구에 대한 링크,에 이어 :

foo& foo::operator=(const foo& matrix) { 
    if (this != matrix) { 
     val = new int; 
     *val = matrix->val; 
     size_t* newArray = new size_t[max]; 
     int newMax = matrix.max; 
     std::copy(matrix.listofVal, matrix.listofVal + max, newArray); 
     if (listofVal) delete listofVal; 
     listofVal = newArray; 
     max = newMax; 
    } 
} 
내가 힙에 로컬 객체를 할당하는 발생할 수 있음을 추가 할 수

메모리 누수 (메소드가 삭제를 담당하는 객체에 할당되기 전에 메소드가 중단되는 경우), 클래스 무결성을 유지하기에 충분할 때만이 완전히 다른 수준의 parannoia입니다.

+1

당신이'foo & foo :: operator = (const foo & matrix)'를 정의 할 생각이라고 생각합니다. – bluefalcon

+0

@John은 개인용으로도 이것을 허용합니까? – SNpn

+0

또한 포인터가 메모리에 할당되어 있으면 포인터를 처리해야합니다. 그렇다면 메모리 손상을 피하기 위해 자체 할당 검사를 포함해야합니다. 그렇지 않으면 메모리가 두 번 릴리스됩니다. – Riga

5

Copy and Swap 이디엄을 사용하는 것이 가장 좋은 방법입니다.
또한, 당신은 복사 할당 연산자 과부하의 필요성을 느낀다면 당신도 아마 복사 생성자뿐만 아니라 클래스의 소멸자에 과부하를 할 필요가 있습니다.

Rule of Three을 살펴보십시오.

+0

복사 및 스왑을 사용하면 필요없는 강력한 예외 안전 보장을받을 수 있습니다. 기본적으로 CAS를 사용하지만, 성능 문제가 발생할 경우 약한 보증만으로 할당 연산자를 구현하는 것을 고려하십시오. – Mankarse

+0

@Mankarse : 왜 카피와 스왑이 최적이 아닌 것 같습니까? –

+0

@Martin 복사 및 스왑은 객체의 각 프리미티브를 임시로 복사 한 다음 해당 임시에서 할당 된 객체로 할당해야하기 때문에 가능합니다. 많은 외부 자원을 소유하지 않은 대형 오브젝트의 경우 속도가 @ 려질 수 있습니다. 또한 할당 된 사람이 이미 할당 한 메모리를 다시 사용할 기회가 손실됩니다. 나는 대부분의 프로그램이 이러한 것들에 의해 상당히 느려지지 않을 것이라고 생각하지만, Copy and Swap에 대한 올바른 대안이 있는지를 아는 것은 가치가있다. – Mankarse