2011-04-22 2 views
4

정수라는 int 역할을하는 사용자 지정 클래스가 있습니다. 동일한 형식을 자동으로 Integer 형식으로 변환하는 방법을 컴파일러에 알려 주므로 계속 동일한 내용을 반복해서 입력하지 않아도됩니다. ,기본 제공 형식에서 사용자 지정 클래스로 변환

someCall(Integer(1), Integer(2)); 

내가 반대를 달성하고자하는 int로 정수를 캐스팅, 내가 찾을 수있는 모두가 oposite을하는 것입니다

내가 봤 한
someCall(1,2); 

그러나이 될 것입니다. 클래스 Integer이 생성자가

class Integer 
{ 
    public: 
     Integer(int); 
}; 

경우에, 당신은이 작업을 수행 할 수 있습니다 :

답변

14

같이, int를 사용하는 생성자 쓰기

void f(Integer); 

f(Integer(1)); //okay 
f(1);   //this is also okay! 

설명입니다 당신이 f(1)을 쓸 때, Integer의 생성자는 int 유형의 단일 인수를 취하고 자동으로 호출되며 임시로 임시 함수를 만든 다음 해당 임시 함수를 functi로 전달합니다. 에!


지금 정확히 반대를하고 싶은 생각, 즉, 함수에 유형 Integer의 객체를 전달하는 int이 소요된다

void g(int); //NOTE: this takes int! 

Integer intObj(1); 
g(intObj); //passing an object of type Integer? 

위의 코드가 작동하려면, 당신이 필요로하는 모든입니다 같은 클래스의 사용자 정의 된 변환 함수를 정의

class Integer 
{ 
    int value; 
    public: 
     Integer(int); 
     operator int() { return value; } //conversion function! 
}; 

그래서 01 취하는 함수 타입 Integer의 객체를 전달할 때이면 변환 함수가 호출되고 객체 암시가 int으로 변환 된 다음 인수로 함수에 전달됩니다.

int i = intObj; //implicitly converts into int 
       //thanks to the conversion function! 
+0

로 변환 연산자를 선언 개체를 변환 할 수 없습니다 I 생각한다. – Puppy

+0

Nawaz 당신이 제안하는 것은 작동하지만, 돌아왔다 (n <2)? 1 : IntegerFromACall; 어느 날, 오류 : 피연산자 :? : 서로 다른 유형의 '정수'와 '정수' –

+0

@ 함자 : 이걸 써주세요 : return (n <2)? 1 : (int) IntegerFromACall;'... 작동합니다! – Nawaz

5

내재적으로 변환하려는 유형의 생성자는 Integer에 정의 할 수 있습니다. 그들을 explicit으로 만들지 마십시오.

4

Nawaz가 정확한 답을 제공했습니다. 나는 단지 someting을 지적하고 싶다. 변환 연산자에서 const되지 않은 경우,`CONST이

const Integer n(5); 
int i = n; // error because non-const conversion operator cannot be called 

더 나은 당신은 이상적 &`와`CONST INT 및 INT`로 변환해야

operator int() const {return value;} 
+0

+1 좋은 지적. 나는 그것을 좋아. :-) – Nawaz

관련 문제