2013-03-16 2 views
1

C++ 멤버와 함수로 연산자를 동시에 오버로드합니까? 여기서 연산자 오버로딩을 설정하려고합니다.C++ 멤버와 함수로 연산자를 동시에 오버로드합니까?

나는 각 경우 친구 및 회원으로 operator + overloading에 문제가 없습니다. 하지만 과부하하려고 할 때 + 연산자를 친구로 사용하면 동시에 친구가 구성원으로 오류가 발생합니다.

종류가 혼동합니다. 나는 심지어 말이 안되는 것을하려고 노력할 수도있다. 내 코드를 확인하고 해결할 수 있는지 확인하십시오. 사례 3은 ERROR 생성 사례입니다. 감사! 친구로

사례 1 과부하 : Source.cpp 친구로

#include <iostream> 
using namespace std; 
#include "Time.h" 
int main() { 
Time planning;  Time coding(2, 40); 
Time fixing(5, 55); Time total; 
total = coding + fixing; 
cout << "coding + fixing = "; 
total.Show(); 
cout << endl; 
cin.get(); return 0; } 

사례 1 과부하 : Time.h 친구로

#pragma once 
class Time 
{ int hours; int minutes; 
public: 
Time(void); 
~Time(void); 
Time(int, int m = 0); 
void AddMin(int); 
void AddHr(int); 
void Reset(int h=0, int m=0); 
friend const Time operator+(const Time&amp;, const Time&amp;); 
void Show() const; }; 

사례 1 과부하 : Time.cpp

#include "Time.h" 
#include <iostream> 
using namespace std; 
Time::Time(void) { hours = minutes = 0;} 
Time::~Time(void) {} 
Time::Time (int h, int m) { hours =h; minutes = m; } 
void Time::AddMin(int m) {minutes+=m; hours+=minutes/60; minutes%= 60; } 
void Time::Reset(int h, int m) {hours = h; minutes = m;} 

const Time operator+(const Time &amp; t1, const Time&amp; t2) { 
Time sum; 
sum.minutes = t1.minutes + t2.minutes; 
sum.hours = t1.hours + t2.hours + sum.minutes/60; 
sum.minutes %= 60; 
return sum; } 
void Time::Show() const 
{ cout << hours << " hours, " << minutes << " minutes"; } 
012 회원으로 3,516,

CASE2 과부하 : Source.cpp/Time.h/Time.cpp Source.cpp // 같은

Time.h

const Time operator+(const Time&amp;) const; // declaration 

Time.cpp

const Time Time::operator+(const Time&amp; t) const { 
Time sum; 
sum.minutes = minutes + t.minutes; 
sum.hours = hours + t.hours + sum.minutes/60; 
sum.minutes %= 60; 
return sum; } // function definition 

사례 3 : 오류; 동시에 친구와 구성원으로 연산자 +를 오버로드하려고 Source.cpp // 같은

Time.h

friend const Time operator+(const Time&amp;) ; // declaration 

Time.cpp

friend const Time operator+(const Time&amp; t) { 
Time sum; 
sum.minutes = minutes + t.minutes; 
sum.hours = hours + t.hours + sum.minutes/60; 
sum.minutes %= 60; 
return sum; } // function definition 
+2

HTML로 포맷을 시도하지 마십시오. 웹 페이지에는이를위한 도구가 있습니다. 화면에 입력하고 서식을 적절하게 적용하기 만하면됩니다. 특히 삽입 된 HTML을 사용하면 코드 형식을 지정하기가 어려우므로 (보통 코드를 선택하고 {} 버튼을 누르기 만하면됩니다) –

+1

읽기 어렵 기 때문에 오류가 표시되지 않지만 IIUC에서는 1) , 그것은 2)와 함께 작동하고, 둘 다 컴파일러는 어느 하나를 사용할지 모른다. 그것에 대해 혼란스러운 점은 무엇입니까? –

+0

그래서 매우 쉽게 배울 수있는 마크 다운의 flaavor를 사용합니다. –

답변

1

당신이 연산자를 제공 귀하의 유형에 대한 과부하, 당신이하는 일은 연산자가 코드에 나타날 때 호출 할 함수를 제공하는 것입니다. 하나만 호출 할 수 있고 선택할 수있는 방법이 없으면 두 가지 정의를 제공하는 것이 타당하지 않습니다.

즉, 멤버 함수와 자유 함수 오버로드가 없어야합니다.

다음에 실제로 혼란 스러울 수있는 것은 friend의 의미입니다. 친구 선언을 제공하면 을 무료로 함수로 선언하고이 함수에 비공개 멤버에 대한 액세스 권한을 부여합니다. 그것은 무료로 기능하고, 같은 따라서 암시 this 인수가 없습니다 :

class X { 
    friend X operator+(X const &); 
}; 

유형 X const&의 단일 인수를 입력 X의 개체를 반환 operator+에 대한 오버로드를 선언 할 것입니다.덧붙여 말하면, 그것은 과부하를 의미하는 것이 아닌 유효한 연산자입니다 (X x; +x;과 같이 단 하나의 operator+ 임). 이전 단락으로 돌아 간다, 그것은 암시 this이없는, 무료 기능이 아닌 멤버 함수를 선언 당신이 선언 한 경우와 같은 :

class X {}; 
X operator+(X const &); 

그리고 암시 this, minuteshours에 의해이 없기 때문에 그들 자신은 그 기능 안에서 의미를 갖지 않으며 컴파일에 실패 할 것이다. 정의에서 friend 키워드도 잘못되었으므로 friend은 클래스 정의 외부에 절대 표시 될 수 없습니다.

friend에 연산자와 관련하여 특별한 의미가 있는지 여부에 대해서는 약간의 혼동이 있지만 그렇지 않습니다. 이는 액세스 지정자에 영향을주는 키워드 일뿐입니다. 유형의 공용 인터페이스 측면에서 연산자를 구현할 수 있다면 처음에는 friend이 아니어야합니다.

class Time { // ... 
public: 
    Time(int hours, int minutes); 
    int hours() const; 
    int minutes() const; 
}; 
Time operator+(Time const & lhs, Time const & rhs) { 
    return Time(lhs.hours()+rhs.hours(), lhs.minutes()+rhs.minutes()); 
} 

관련없는 우정 : 예를 들어 당신이 시간과 분을 얻기 Time에서 접근이 있다면 그래서, 당신은 연산자를 구현할 수 있습니다.

+0

명확한 답변을 주셔서 감사합니다. 그것은 나를 많이 돕는다! –

관련 문제