我尝试使用三元运算符创建对象,但每次都只调用第一个对象。这是我的简单代码:
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函数之后,使用Debuger的一些方法是,被调用的构造函数是使用一个对象的构造函数:
myClass(int x)
但我想使用这两个参数,我如何调用另一个:
myClass(int x, int y)
使用三元运算符?
答案 0 :(得分: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);
}
逗号运算符计算左侧的表达式,丢弃它并评估右侧的表达式。所以你实际写的是:
(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);