2011-04-22 8 views
4

私はIntegerと呼ばれるintとして動作するカスタムクラスを持っています。同じタイプを繰り返し入力することを避けるために、特定の型をIntegerに自動的に変換する方法をコンパイラに教えたいと思います、組み込み型からカスタムクラスへの変換

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

someCall(1,2); 

になる私はGoogleで検索しましたが、私は見つけることができるすべては、私は反対のことを達成したいint型の整数を鋳造し、opositeを行うことです。

答えて

14

として、intを取るコンストラクタを書く:、

void f(Integer); 

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

説明は、あなたがf(1)を書くときということです:クラスIntegerは、このコンストラクタを持っている場合は、あなたがこれを行うことができ、その後、

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

Integerのコンストラクタは、タイプintの単一の引数をとり、自動的に呼び出され、その場で一時的に作成され、その一時的なものがfunctiに渡されますに!あなたが必要とするすべてがある

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

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

上記のコードを動作させるには、:


は今、つまり、関数にタイプIntegerのオブジェクトを渡すとintを取るあなたは正反対をしたいと仮定しますだから01を取る関数にタイプIntegerのオブジェクトを渡すとき

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

:のように、クラスのユーザ定義の変換関数を定義しますの場合、変換関数が呼び出され、オブジェクトの暗黙性がintに変換され、引数として関数に渡されます。

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

として、あなたの変換演算子を宣言するのconstオブジェクトに

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

を変換することはできません 思う。 – Puppy

+0

あなたが何を提案しているかわからないが、私はリターンを持っている(n <2)? 1:IntegerFromACall;これは私にエラーを与えます:オペランドは?:異なる型 'int'と 'Integer'を持っています –

+0

@ハムザ:これを書いてください: 'return(n <2)? 1:(整数)IntegerFromACall; '...これは動作します! – Nawaz

5

暗黙的に変換するタイプのコンストラクタをIntegerに定義することができます。しないでください。explicit

4

Nawazが正しい答えを与えました。私はちょうどsometingを指摘したい。変換演算子がCONSTされていない場合、あなたはより良い私は、あなたが理想的に `INT&`と ``のconst int型&に変換する必要があり

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

+1良い点。私はそれが好き。 :-) – Nawaz

関連する問題