gpt4 book ai didi

c++ - 用一个参数调用的重载函数,但我以为我传递了两个

转载 作者:太空狗 更新时间:2023-10-29 23:42:46 24 4
gpt4 key购买 nike

我最近重构了这样的代码(MyClassMyClassR)。

#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;
}
  • 错误是什么,
  • 为什么它可以编译(使用 VC6 以及 VC9 警告级别 4 测试:没有投诉)和
  • 正确的做法是什么?

我(假设)我已经有了所有这些答案,但我认为分享这个问题很有趣。

更新
扩展代码,使其可以“复制、粘贴和执行”。 VC9 也没有给我任何投诉,所以 VC6 不是这里的问题。
为了完整起见,输出为:

a:
first: 1 second: 2 third: 1.054069532
b:
first: 1 second: 2 third: 1.004499999

最佳答案

我不确定你到底期望什么,但让我们开始吧......

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

  • m_third 的构造函数并没有按照您的预期进行。您不能像这样编写条件表达式:“多个参数”在 C++ 中不是有效的表达式,并且条件运算符适用于表达式。

  • 代码可以编译,因为它仍然正确,只是没有按照您的意愿执行。它不使用“多个参数”,而是评估仅采用表达式的 last 值的序列点运算符 (,),因此您的条件实际上等同于:是吗? y : x

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

  • SomeMember 的第三个构造函数是错误的,该值可能会溢出,产生一个负值——我非常怀疑这就是您想要的。

关于c++ - 用一个参数调用的重载函数,但我以为我传递了两个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2475657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com