2010-06-21 5 views
14

나는이 같은 노력하고있어C++ 대입 연산자가 자유 함수가 될 수 있습니까?

Foo & operator=(Foo & to, const Bar &from); 

을하지만이 오류 받고 있어요 :

E2239 'operator =(Foo &, const Bar &)' must be a member function 

는 사업자/무료 기능을 정의 할 수 없습니다 수있는 제한이 있습니다, 그리고 만약 그렇다면 , 왜?

답변

22

할당 연산자는 비 정적 멤버 함수이어야하며 정확하게 하나의 파라미터가 있어야

An assignment operator shall be implemented by a non-static member function with exactly one parameter (C++03 13.5.3/1).

operator(), operator[]operator-> 또한 비 정적 멤버 함수로서 구현되어야한다.

클래스 별 operator newoperator delete (및 그 변종) (그들이 static 키워드로 선언되지 않은 경우에도, 이러한 암시 적 정적 참고) 정적 멤버 함수로 구현해야합니다.

+2

이렇게하는 이유는 무엇입니까? 연산자 =가 멤버 함수가된다는 것은 의미가 있습니다. 결국 그것은 'three'복사 제어 함수 (즉, 복사 생성자, operator = 및 destructor) 중 하나입니다. 하지만 왜 다른 사람들을 위해서? – zoujyjs

+1

@zoujyjs 연산자는 내부 멤버 변수 (개인 변수 일 수도 있음)에 액세스 할 수 있어야합니다. 무료 기능에는 이러한 액세스 권한이 없습니다. – iheanyi

+0

@iheanyi 그러나 우리는 클래스 –

-1

수 없습니다.

이유는 복사 생성자와 관련이 있습니다. 그것들은 매우 유사한 의미를 가지고 있으며, 다른 생성자와 마찬가지로 클래스 외부에서 복사 생성자를 정의 할 수 없습니다. 그래서, 그들은 쌍둥이를 멀리 떨어 뜨리고 싶지 않았습니다 (쌍둥이의 역설을 피하기 위해서 :).

P. C++에서 부끄러운 점은 기존 클래스에 멤버를 추가 할 수 없다는 것입니다. 낮은 수준의 이유는 없습니다. 가능하다면, 클래스 정의 헤더에 private 함수를 선언하지 않음으로써 헤더와 cpp 의존성을 분리 할 수 ​​있습니다.

+5

클래스 정의가 완료된 후에 회원님을 추가하는 것에 대해 이야기하는 것이 확실한 이유가 있습니다. 나중에 가상 멤버를 추가 할 수 없습니다. 클래스 정의가 완료 될 때까지는 컴파일러가 객체 (vtable! 포함)의 크기를 알아야하기 때문입니다. 클래스 정의 외부에 가상이 아닌 멤버를 추가하면 개인 데이터를 검사/수정 한 멤버를 누구나 추가 할 수 있기 때문에 '개인'이 무의미 해집니다. 전반적으로 C++의 맥락에서 볼 때, 달성하려고 시도했던 것의 대부분을 깨뜨릴 것입니다. –

+0

글쎄, 먼저 공개 회원을 추가하는 것이 좋습니다. 둘째, 더 중요한 것은 종속성을 분리하는 데 도움이되는 클래스 정의에서 "친구"또는 일종의 순방향 선언 만 필요하다는 것입니다. –

+0

나는 C++의 '부끄러움'에 대한 당신의 요점을 따르지 않는다. 기존 클래스에 무언가를 '추가'하고 싶다면 하위 클래스를 만드는 것이 어떻습니까? 대신 원래 클래스가 완전히 구현 된 후에 '원래 클래스를 수정하는'것이라고 생각했다면 C++이 작동하는 방식이라고 생각하지 않습니다. – Diaz

관련 문제