用一个参数调用重载函数,但我以为我已经通过了两个

for*_*idt 2 c++ refactoring ternary-operator

我最近重构了这样的代码(MyClassto MyClassR).

#include <iostream>

class SomeMember
{
public:
  double m_value;

  SomeMember() : m_value(0) {}
  SomeMember(int a) : m_value(a) {}
  SomeMember(int a, int b)
  : m_value(static_cast<double>(a) / 3.14159 +
            static_cast<double>(b) / 2.71828)
  {}
};


class MyClass
{
public:
SomeMember m_first, m_second, m_third;

MyClass(const bool isUp, const int x, const int y)
{
  if (isUp)
  {
    m_first = SomeMember(x);
    m_second = SomeMember(y);
    m_third = SomeMember(x, y);
  }
  else
  {
    m_first = SomeMember(y);
    m_second = SomeMember(x);
    m_third = SomeMember(y, x);
  }
}
};


class MyClassR
{
public:
SomeMember m_first, m_second, m_third;

MyClassR(const bool isUp, const int x, const int y)
: m_first(isUp ? x : y)
, m_second(isUp ? y : x)
, m_third(isUp ? x, y : y, x)
{
}
};


int main()
{
    MyClass a(true, 1, 2);
    MyClassR b(true, 1, 2);

    using namespace std;
    cout.precision(10);
    cout
        << "a:" << endl
        << "\tfirst: " << a.m_first.m_value 
        << "\tsecond: " << a.m_second.m_value 
        << "\tthird: " << a.m_third.m_value << endl;

    cout
        << "b:" << endl
        << "\tfirst: " << b.m_first.m_value
        << "\tsecond: " << b.m_second.m_value
        << "\tthird: " << b.m_third.m_value << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  • 什么是错误,
  • 为什么要编译(用VC6测试以及VC9警告级别4:没有投诉)和
  • 这样做的正确方法是什么?

我(假设)我已经有了所有这些答案,但我认为这是分享的有趣问题.

更新
扩展代码,以便"复制并粘贴并执行"-able.VC9没有给我任何投诉,所以VC6不是问题.
为完整起见,输出为:

a:
        first: 1        second: 2       third: 1.054069532
b:
        first: 1        second: 2       third: 1.004499999
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 8

我不确定你到底想要什么,但让我们开始......

  • 首先,沟VC6.认真.使用它是一个巨大的问题,因为它不符合标准并排除了很多选择.正确使用它就像玩俄罗斯轮盘赌.

  • 你的构造函数m_third不符合你的想法.你不能写这样的条件表达式:"几个参数"不是C++中的有效表达式,条件运算符用于表达式.

  • 代码编译因为它仍然是正确的,它只是没有做你想要的.它不是使用"几个参数",而是计算序列点operator(,),它只取表达式的最后一个值,因此您的条件实际上等效于:isUp ? y : x

  • 正确的方法是使用两个条件:m_third(isUp ? x : y, isUp ? y : x)

  • 第三个构造函数SomeMember是错误的,值可能溢出,产生负值 - 我非常怀疑这是你想要的.

  • 请风暴进入强迫您使用VC6的人居住的房间,然后向他们扔一把椅子.为了我.您可以选择为其他SO成员抛出额外的椅子.我建议确保椅子的腿部朝向头部,以获得最大的疼痛. (7认同)
  • @Dennis Zickefoose`m_third(isUp?x,y:y,x)`~`m_third((isUp?(x,y):y),x)` (3认同)