2011-12-10 5 views
8

그래서, 다른 날 시험을했고, 질문 중 하나이 매우 비슷한이었다static_cast 과부하?

우리는 변수 int side 보유 Square라는 클래스가 있습니다. cout << static_cast<int>(aSquare) <<endl;이 aSquare 영역을 어떻게 인쇄 할 수 있을까요?

그게 가능합니까?

답변

18

해당 작업을 수행 할 수는 있지만 오버로드를 통해 수행 할 수는 없습니다. static_cast<>(). 당신은 타입 캐스트 연산자를 오버로딩하여 수행 :

class Square 
{ 
public: 
    Square(int side) : side(side) {} 
    operator int() const { return side * side; } // overloaded typecast operator 
private: 
    int side; 
}; 

// ... 

// Compiler calls Square::operator int() to convert aSquare into an int 
cout << static_cast<int>(aSquare) <<endl; 

가 더 자주 좋은보다 더 많은 피해를 수행하는 경향이보다 그 오버로드 캐스트 연산자를 조심하십시오. 그들은 무의미한 암시 적 캐스트 조작을 가능하게합니다. 아래 코드를 읽으면 "s의 영역을 차지할 것"이라고 생각하십니까?

Square aSquare; 
int a = aSquare; // What the heck does this do? 

확실히는 아닙니다. 이 방법이 더 의미가 훨씬 더 읽을 수 :

Square aSquare; 
int a = aSquare.GetArea(); 

가 일반적으로 당신이 GetSide() 또는 GetApothem() 또는 GetPerimeter()이든 같은 Square에 대한 다른 정보에 액세스 할 수있게하려면 언급 할 필요가 없을 것입니다. operator int()은 분명히 int 하나만 반환 할 수 있으며 클래스의 구성원으로 복수 operator int()을 가질 수 없습니다. Square 42보다 커야하는

Square s; 
if(s > 42) {} // Huh?! 

그것은 무엇을 의미 하는가 :

여기에 아직 컴파일 아무런 의미가없는 operator int() 코드를 만드는 또 다른 상황입니까? 말도 안되지만 operator int()을 사용하면 Shapeint으로 변환 될 수 있습니다. int의 값은 4과 비교할 수 있습니다.

이렇게 타입 변환 연산자를 쓰지 마십시오. 실제로 타입 변환 연산자를 오버로드하는 경우 수행중인 작업에 대해 두 번 생각할 수 있습니다. 실제로 타입 변환 연산자의 오버로드가 현대 C++에서 유용 할 경우가 있습니다 (예 : the safe bool idiom).

+0

+1 : Square 클래스는 몇 가지 더 많은 메소드를 사용할 수 있습니다. 'int GetSideLength() const','int GetPerimeter() const', 그리고'GetArea()'에 명명 된 메소드를 사용해야한다는 것은 모호성을 제거하기위한 것입니다. – rwong

+0

정교한 답변 주셔서 감사합니다. – Radix

+2

@In silico : C++ 11에서는 변환 연산자에 대해 'explicit'키워드를 지원하기 때문에 더 이상 안전한 bool 관용구가 필요하지 않습니다. – smerlin

1

당신은 광장 클래스의 변환 연산자를 제공 할 수있다 :

struct square { 
    operator int() const { 
    return (side * side); 
    } 
    int side; 
}; 

유일한 문제는 그것이 암시 적으로 사용됩니다, 그리고 아무튼 캐스팅 :

class Square 
{ 
public: 
    operator int() 
    { 
     return side * side; 
    } 
private: 
    int side; 
}; 
+0

측면이 아닌 영역을 반환해야합니다. – Dani

+2

매우 작은 사각형의 경우에도 적용됩니다. –

+2

@Dani : 나는 당신이 그 요점을 놓치고 있었다고 생각합니다. 나는 영업 이익이 지역을 계산하는 방법을 알고 있다고 확신합니다. 문제는 기술적 인 부분 인 정사각형 객체로부터 int를 얻는 방법에 정확하게 응답했습니다. –

4

당신은 캐스트 연산자를 오버로드 할 수 있습니다 여기에 많은 의미가 있습니다. 당신이 캐스트를 사용해야하는 경우

struct square { 
    int get_area() const { 
    return (side * side); 
    } 
    int side; 
} 

는, C를 사용 : 당신은 또한 캐스트의 종류 (static_cast, C 스타일 등)

이 일을 할 수있는 좋은 방법입니다 구별 할 수 없습니다 ++ 11 기능을 선택하고 explicit으로 표시하십시오. 이것은 암시 적 캐스팅 실수를 방지합니다.