2016-04-06 18 views
-2

三項演算子を使ってオブジェクトを作成しようとしていますが、毎回最初のものだけが呼び出されます。三項演算子を使った初期化クラスオブジェクトエラー

bool itTrue(int x, int y){ 
    if(x>y) 
    return true; 
    return false; 
} 
class myClass { 
    public: 
     myClass(int x){ 
      val=x; 
     } 
     myClass(int x, int y){ 
      val=x*y; 
     } 
     val=0; 
}; 
int main(){ 
    aa=5; 
    bb=6; 
    myClass cc = isTrue(aa,bb) ? (aa,bb) : (bb,bb); 
    cout<<cc.val<<endl; 
    return 0; 
} 

は、isTrue関数が呼び出された後、呼び出されるコンストラクタは一つのオブジェクト使用して1か、Debugerを使用しているいくつか:ここに私の簡単なコードである myClass(int x) をしかし、私は両方の引数を使用する場合、どのように私は他の1つを呼び出しますか: myClass(int x, int y)三項演算子を使用してですか?

+2

あなたはに取得しようとしていますカンマ演算子を知っている。そして、もしあれば、 "short"は何ですか? – LogicStuff

+2

適切なコピーコンストラクタを用意し、 'myClass cc = isTrue(aa、bb)? myClass(aa、bb):myClass(bb、bb); ' –

+0

コピーコンストラクタを無視し、あなたが言ったように書くべきですか?それとも実装する必要がありますか? – raptor0102

答えて

1

あなたがしようとすると、あなた自身の質問の全体に答える前に、我々はそれが三項演算子含まないように簡素化するときに何が起こるかを見なければならない:

myClass cc = (aa, bb); 

これはまた、単一パラメータのコンストラクタを呼び出しますが、あなたは、コンストラクタにパラメータを渡す方法がこれではないので、それはあなたが「コンマ演算子」を呼び出している何をしているか代わりに

myClass cc(aa, bb); 

、同じではありません。単一の値コンストラクターに渡される値を調べる必要があります。値がbbであることがわかります。

#include <iostream> 

class A { 
public: 
    A(int a) { 
     std::cout << "single " << a << '\n'; 
    } 
    A(int a, int b) { 
     std::cout << "double " << a << ',' << b << '\n'; 
    } 
}; 

int main() 
{ 
    int aa = 5; 
    int bb = 6; 

    A a = (aa, bb); 
} 

http://ideone.com/wapbv9

コンマ演算子は、左の式を評価し、それを破棄し、右側の式を評価します。それでは、あなたが実際に書いていることは次のとおりです。

(void)aa; // a way to say "evaluate this and ignore it" 
A a = bb; 

あなたがあなたのクラスのインスタンスを作成する必要があります達成しようとしているものを行うためには:

myClass cc = isTrue(aa, bb) ? myClass(aa, bb) : myClass(bb, bb);