2011-07-03 18 views
1

コンパイラは変換演算子の助けを借りて、あるオブジェクトを他のオブジェクトの型に変換しようとします。これを行う方法は2つあります。コンストラクタ(クラスを他のクラスに変換する)または変換演算子.So 、これは単なるテストすることです、私は下の【選択コードがエラーにC++の変換演算子

using namespace std ; 
class A 
{ 
    int i ; 
    public: 
      A(int a=0){this->i=a;} 
      A operator+(const A& b){ 
        A c ; 
        return c(this->i+b.i); 
      } 
      void show() 
      { 
        cout<<i<<endl; 
      } 
}; 
int main() 
{ 
    A a1(1),a2(2),a3; 
    a3=a2+a1; 
    a3.show(); 
    return 0; 
} 

を与え、私はエラーがオペレータ+ .Whenであると思い概念を徹底していた場合、私は、(i).Thereを割り当てようですintからAを作成できる演算子には一致しません。

しかし、私はこのAのコンストラクタが潜んでいるのを見ています。これはintをAに変換できます。補間、intをAに変換します。呼び出しはA(B)になります。これはコピーコンストラクタこの呼び出しはうまくいくはずです。しかし、そうではありません。まったく、まったく混乱しています。

助けてください。あなたがその存在しない演算子()(int)を呼び出し、その戻り値を返す、その後、デフォルトコンストラクタを持つオブジェクトを構築するためにコンパイラに指示していこの2行で

+1

エラーメッセージを貼り付けます。 –

+0

これらのメソッドを 'const'にします(回答で指摘されたエラーを修正した後)。 –

答えて

7

   A c ; 
       return c(this->i+b.i); 

のいずれかを使用しますちなみに、暗黙のための例を
A c(i + b.i); 
return c; 

又は

return A(i + b.i); 

あなたのクラスの変換演算子、:

operator int() const 
{ 
    return i; 
} 

しかし、彼らの使用は悪いデザインのようなにおい、と悪いものが暗黙のブール値への変換やポインタのように、起こることがあります。代わりに、int toInt() constのメンバー関数のようなものを使用してください。

+0

しかし、 '' return c(this-> i + b.i); 'をコールすると、なぜコンストラクタが呼び出されず、intをA型に変更してコピーコンストラクタを呼び出そうとしますか?断片 以下 'クラスBigBuffer {公共のよう : BigBuffer(INTはinitialValue) {memsetの(バッファ、はinitialValue、はsizeof(バッファ))。 } プライベート: charバッファ[65536]; }; にextern無効はFoo(constのBigBuffer & o); 無効おっと() { はFoo(3); } ' これは私が言ったように私はあなたがコンストラクタまたは関数を呼び出していない、!! – aasthetic

+0

を想定同じフォーマットに従うべきです 'operator()(int)'を持っていれば、Aオブジェクトも受け入れます(ただし、そうでない場合は例外です)。コンストラクタは 'explicit'です)、その動作はあなたの最初の例で望むものではなく、Aオブジェクトを返さないこともあります。存在しない 'operator()'ではなく、関数を呼び出しているので、暗黙の変換がそこで機能します。 – Frigo

+0

あなたは私にこれらのタイプの質問のための良いリソースを与えることができますか?私はこの "暗黙の変換"のこととかなり混同しているようです。私はすべてのcosntructorsを明示的にするべきですが、それを知って、いくつかのインターネットフォーラムなどの記事。(お願い、bjarne strustroupとは言わないでください) – aasthetic