1

我正在编写一个基本的类程序,并且在没有运算符重载的情况下完成了这一切,现在我想尝试重载我所有的运算符。我还将尝试 +、==、!= 和 <<,但现在我对乘法感到困惑。

  1. 在测试驱动程序中,用户输入一个因素。我在类中定义了这个因素,但不知道如何从驱动程序中为其分配一个值。有什么帮助吗?

  2. 在运算符重载函数中,我想将该因子乘以对象。--> 对象有五个组成部分,即一个数字列表。总和、长度、平均值、最小值和最大值。将一个对象乘以一个常量的目的是产生一个与第一个类相同的类,除了列表中的每个数字都乘以因子。为了达到这个目的,所有需要做的就是将 Sum 乘以因子,将新的 Sum 除以旧的 Length 得到新的 Mean,然后将 Min 和 Max 乘以因子。

到目前为止,这是我的超载:

Statistician Statistician::operator* (Statistician& temp)
{
    Statistician Stat3;

    Stat3.newLength = temp.newLength;
    Stat3.newSum = (factor * temp.newSum);
    Stat3.newMean = (temp.newSum / temp.newLength);
    Stat3.newMaximum = (factor * temp.newMaximum);
    Stat3.newMinimum = (factor * temp.newMinimum);

    return Stat3;
}

这是测试驱动程序中的内容:

system("CLS");
cout << endl << " Multiply by factor of:  ";
cin >> // Input factor
Stat3 = Stat1 * factor;

最后,我在课堂上定义了“因素”,在“私人”下——如果有错请告诉我。

4

1 回答 1

1

您通常不想修改您正在应用的对象operator*,因此它的签名将是

Statistician Statistician::operator* (const Statistician& temp) const;

如果你打电话Stat1*factor*thisStat1tempfactor。也就是说,您可能需要考虑以此来实施operator*=和定义operator*。有图书馆可以帮助您,请参阅我的个人资料以获取一些链接。

如果你想实现operator*=,它的签名将是

Statistician& Statistician::operator*= (const Statistician& value);

并且,如果factor可能是其他类型,您可以重载该类型,例如:

Statistician& Statistician::operator*= (const int value);

允许Statistician按整数值缩放 的实例。后者似乎比在你的类中存储一些因素更合适,但是如果没有看到更多的代码,就很难说清楚。

这是一个建议operator*=(const int factor)

Statistician& Statistician::operator*= (const int factor)
{
    newSum *= factor;
    newMean = newSum / newLength;
    newMaximum *= factor;
    newMinimum *= factor;
    return *this;
}

如您所见,如果您以正确的方式进行操作,事情通常会变得更容易,因此更不容易出错。

现在您可以operator*=直接使用因子调用,无需在类中存储因子,并且类本身变得更容易。最后,你可以operator*在你的类之外定义一个自由函数:

Statistician operator* (const Statistician& lhs, const int factor )
{
    Statistician result( lhs ); // make a copy
    result *= factor;
    return result;
}

或者只使用其中一个库operator*为您生成。

于 2013-09-30T16:11:14.187 回答