2016-04-06 30 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);