2016-04-06 50 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; 
} 

一些如何使用Debuger,IsTrue運算函數被調用後,誰被調用構造函數是使用一個對象之一: myClass(int x) 但我想使用這兩個參數,如何我打電話給另一個: 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);