2011-04-22 41 views
4

我有一个自定义类,它充当一个名为Integer的int,我想告诉编译器如何自动将某些类型转换为Integer,这样我就可以避免一次又一次地输入相同的东西,从内置类型到自定义类的转换

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

将成为

someCall(1,2); 

我GOOGLE了,但所有我能找到的就是做oposite,铸造整数为int我想完成相反。

回答

14

写一个构造函数int,如:

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

如果该类Integer有此构造,那么你可以这样做:

void f(Integer); 

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

的解释是,当你写f(1),那么Integer的构造函数会自动调用一个类型为int的单参数,并创建一个临时的动态,然后该临时被传递给函数上!


现在假设你想要做的完全相反,即,通过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! 
}; 

因此,当你经过Integer类型的一个目的是这需要01的功能,然后转换函数被调用,并且对象隐含转换为int然后传递给函数作为参数。你也可以这样做:

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

理论上,应该转换为'INT&'和'const int的&',我认为。 – Puppy 2011-04-22 14:49:39

+0

纳瓦兹你建议的作品,但我有回报(n <2)? 1:IntegerFromACall;这给了我,错误:操作数为?:有不同的类型'int'和'Integer' – 2011-04-22 15:07:05

+0

@Hamza:写这个:'return(n <2)? 1:(int)IntegerFromACall;'...这将工作! – Nawaz 2011-04-22 15:10:57

5

你可以定义Integer中的构造函数,用于你想要隐式转换的类型。不要让他们explicit

4

纳瓦兹给出了正确的答案。我只想指出一些。 如果转换操作不是const的,你不能转换const对象变成

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

更好的声明转换运算符,

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

+1好点。我喜欢它。 :-) – Nawaz 2011-04-22 14:48:49

相关问题