2014-10-05 6 views
1

아래 코드는 Distance 클래스의 일부입니다. 연산자 오버로드는 Distance 클래스의 private 멤버로 선언 된 friend 함수이며 호출하려고하는 함수는 public 멤버입니다. 이 함수는 Distance 클래스의 멤버 변수를 변경하지 않습니다.친구 함수 내부의 개체에있는 멤버 함수에 액세스

두 개의 상수 호출 d1과 d2 상수를 유지하려고하는데 내 컴파일러는 ConvertToInches 함수 또는이 함수에도 불구하고 거리 클래스 안에있는 함수를 호출하여 const 속성을 위반한다고 말합니다. Distance 클래스 내에서 private 변수를 변경하지 않습니다.

d1과 d2를 상수로 만들지 않으면 컴파일러에 문제가 없습니다.

아무도이 함수를 호출하는 동안 d1과 d2를 상수로 만드는 방법을 설명 할 수 있습니까? 왜 내가 가지고있는 함수가 작동하지 않습니다?

감사합니다.

const Distance operator+(const Distance& d1, const Distance d2) 
//this is a friend function 
//declared in private section of Distance class 
{ 
    //this function is what causes problems !!!!!!! 
    d1.ConvertToInches(1, 2, 3, 4); 

    Distance d3 = 3; 
    return d3; 
} 

Distance::ConvertToInches(const int cMiles, const int cYards, const int cFeet, const int cInches) 
//declared in public section of Distance class 
{ 
    cMiles = cMiles * 63360; 
    cYards = cYards *36; 
    cFeet = cFeet * 12; 

    int cSum = cMiles + cYards + cFeet + cInches; 
    return cSum; 
} 
+0

왜 @CIsForCoocckies가 대답을 삭제했는지 모르겠습니다. 'ConvertToInches'의 선언에 따르면, 비 const 멤버 함수입니다. 그것들은 친구'operator +'의 매개 변수처럼'const' 객체에서 호출 될 수 없습니다. – dyp

+0

아니면,'ConvertToInches'가'정적'멤버 함수입니까? (당신이 보여준 스 니펫 (snippet)에서 명확하지 않다.) 어쨌든 데이터 멤버 나 'Distance'의 private 멤버에 액세스하지 않는다면 멤버 함수, 정적 또는 비 멤버이어야하는 이유가 없다. 공전. – dyp

답변

1

문제는 ConvertToInches 방법을 const 선언되지 않으며, 당신은 const를 거리 & 객체의 메소드를 호출하려고 시도하고 있다는 점이다. 간단한 수정 선언과 함수의 정의에 CONST를 추가하는 것입니다

class Distance 
{ 
public: 
    int ConvertToInches(const int cMiles, const int cYards, const int cFeet, const int cInches) const; 
}; 

int Distance::ConvertToInches(const int cMiles, const int cYards, const int cFeet, const int cInches) const { /* ... */ } 

또 다른 사소한 문제 귀하의 코드와 함께 : D2는 D1 같은 const를 참조하지 않습니다.

+0

감사합니다. 이것은 완벽합니다! –

관련 문제