数值数组类:使用友元函数进行乘法运算

Numeric Array Class: Multiplication using friend functions

本文关键字:函数 运算 友元 数组      更新时间:2023-10-16

我已经尝试解决这个bug好几天了。我制作了一个泛型数组类,从中我使用泛型继承创建了一个数字数组。一切都很完美;但是,我在数字数组的乘法/缩放方面遇到了问题。我以以下标准方式超载操作员*:

  //Scaling operator 
   template <typename Type>
   NumericArray<Type>& NumericArray<Type> :: operator * (const double factor) // scaling the elements 
{
    for (int i = 0; i < (*this).size(); i++)
    {
        (*this)[i] *= factor; 
    }
    return *this; 
}

当然,由于这个实现所要求的固有顺序,我只能用数组*2的方式进行乘法。但我也想写2*数组。所以我决定实现一个朋友功能如下:

template <typename Type> 
NumericArray<Type> operator* (Type factor, const NumericArray<Type>& num_array)
{
    return(num_array * factor);
}

这个朋友函数的声明如下:

template <typename Type> friend NumericArray<Type> operator * (double factor, const NumericArray<Type>& num_array);

但是当我尝试在main((中写入2*数组时,我得到了错误消息:

严重性代码描述项目文件行错误C2678二进制"*":找不到接受"const NumericArray"类型左侧操作数的运算符(或者没有可接受的转换(

这个错误让我认为main((甚至没有识别出friend函数的存在。我以前使用过几次friend函数,但我对模板还很陌生。有人告诉我,模板和通用编程通常有一些奇怪而古怪的必需品,这可能会导致不可预见的情况。

对于任何想要查看完整程序的人,请参阅下拉框链接:https://www.dropbox.com/sh/86c5o702vkjyrwx/AAB-Pnpl_jPR_GT4qiPYb8LTa?dl=0

再次感谢您的帮助:(

友元函数中的NumericArray<Type>是const,它不能调用非const函数---NumericArray<Type>& NumericArray<Type> :: operator * (const double factor)

NumericArray<Type>& operator * (const double factor)

这是一个非常数成员函数。这意味着它可能会改变它调用的对象

免费运营商函数中的参数(如果调用上面的公共运营商,则不需要是朋友(是

const NumericArray<Type>&

因此CCD_ 3合格。

为了解决这个问题,您需要将成员函数更改为可在const限定的实例上调用(假设它确实不会改变它的实例,而这不应该((*(:

NumericArray<Type>& operator * (const double factor) const

(*(你的正在改变它的实例,这与直觉相反:

c = a * b;

一般来说,您不希望a在那之后发生更改。


正如Nicky C在他的回答中所建议的那样,这里最好的方法可能是将operator*=作为(非常量,公共(成员函数,它正在做你的operator*目前似乎正在做的事情。

然后添加两个免费的operator*函数,它们使用operator*=来实现它们的行为。

所以在这种情况下不需要friend

我不确定是否要解释所有内容,因为如果深入研究,可能会很复杂。但简而言之:

  1. 您混淆了*=*的含义和实现
  2. 这些错误涉及很多方面:模板实例化、常量正确性、过载解决

所以,让我们看看惯用的方法。

步骤1:编写成员operator *=

template <typename Type>
class NumericArray
{
    //...
    NumericArray& operator *= (const Type factor)
    {
        [[ Code that scales up every element, i.e. your for-loop ]]
        return *this;
    }
    //...
}

步骤2:编写一对非成员非好友operator *

template <typename Type>
NumericArray<Type> operator * (const NumericArray<Type>& num_array, const Type factor)
{
    NumericArray<Type> new_num_array = num_array; // Copy construct
    new_num_array *= factor; // Scale up
    return new_num_array;
}
// And similarly for factor*num_array