Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 运算符重载C++;对于操作员+;和操作员=_C++_Vector_Operators_Overloading - Fatal编程技术网

C++ 运算符重载C++;对于操作员+;和操作员=

C++ 运算符重载C++;对于操作员+;和操作员=,c++,vector,operators,overloading,C++,Vector,Operators,Overloading,对于运算符重载,我整天都在挠头,运算符+函数正确地计算数据,但我需要将temp class的数据传递给operator=以将其分配给类的一个单独实例,并且返回的temp不起作用(我想数据在退出时会被销毁?) 整个想法是从main调用x=y+z,将y和z的两个向量的数据相加,并将其赋值到x,我得到了y+z的正确计算结果,但将它传递到x,我碰到了一堵砖墙,怎么了?或者有人知道吗? 这是我班上的一段代码 VecXd& operator=(const VecXd& rhs) {

对于运算符重载,我整天都在挠头,运算符+函数正确地计算数据,但我需要将temp class的数据传递给operator=以将其分配给类的一个单独实例,并且返回的temp不起作用(我想数据在退出时会被销毁?) 整个想法是从main调用x=y+z,将y和z的两个向量的数据相加,并将其赋值到x,我得到了y+z的正确计算结果,但将它传递到x,我碰到了一堵砖墙,怎么了?或者有人知道吗? 这是我班上的一段代码

VecXd& operator=(const VecXd& rhs)
{
    VecXd<V> temp;
    temp.dimension = rhs.dimension;
    cout << "operator= check dimension is..." << temp.dimension << endl;

    for(int i = 0; i < rhs.dimension; i++)  //Passing data to x?
    {
        cout << "test" << endl;
        temp.vecArr[i] = rhs.vecArr[i];
        cout << temp.vecArr[i] << " our new value" << endl;
    }
}

friend VecXd& operator+(VecXd& lhs, VecXd& rhs){

    VecXd<V> temp;
    cout << lhs.dimension << "-lhs d-" << rhs.dimension << "-rhs d-" << endl; //works
    if(lhs.dimension == rhs.dimension) //dimension level check
    {
        temp.vecArr = new V[lhs.dimension];
        for(int i = 0; i < lhs.dimension; i++)
        {
            temp.vecArr[i] = lhs.vecArr[i] + rhs.vecArr[i];
            cout << temp.vecArr[i] << " our new value" << endl;
        }
        //return *temp.vecArr;
        return temp; //***? how to pass data?
    }
    else{
        cout << "Dimensions do not match!!! Error!" << endl;
    }
}
VecXd&operator=(常量VecXd&rhs)
{
VecXd温度;
温度尺寸=右侧尺寸;
cout这应该有你所需要的一切,并对所涉及的逻辑有一个相对清晰的解释。无论如何,你都不需要遵循这里列出的规则和指导方针,但它们在一般情况下很有效

在算术运算符的特定情况下,该运算通常是根据+=运算符定义的,正如chris在您的原始帖子上的评论所述。这意味着您通常会传入右参数和左参数,复制lhs,并使用lhs_copy+=rhs查找结果;使用thi更容易避免代码重复记住,您只需在+=中创建一次加法逻辑,然后在++中调用它

您返回的结果不能是引用-函数中创建的任何内容都不会持久,但lhs或rhs参数都不应更改。相反,您只需返回作为实例递增的重复lhs-在您的情况下,函数签名为:

const VecXd operator+(const VecXd& lhs, const VecXd& rhs). 
您的输入可以而且应该是常量,因为函数中的任何一项都不会更改,加州理工学院网页建议返回类型为常量实例,以禁止某些奇怪的操作,这在许多情况下也是一种很好的做法。

这应该包含您需要的所有内容,并对所涉及的逻辑进行相对清晰的解释。这不是通过任何方式,你都必须遵守这里列出的规则和指导方针,但它们在一般情况下都很有效

在算术运算符的特定情况下,该运算通常是根据+=运算符定义的,正如chris在您的原始帖子上的评论所述。这意味着您通常会传入右参数和左参数,复制lhs,并使用lhs_copy+=rhs查找结果;使用thi更容易避免代码重复记住,您只需在+=中创建一次加法逻辑,然后在++中调用它

您返回的结果不能是引用-函数中创建的任何内容都不会持久,但lhs或rhs参数都不应更改。相反,您只需返回作为实例递增的重复lhs-在您的情况下,函数签名为:

const VecXd operator+(const VecXd& lhs, const VecXd& rhs). 

您的输入可以而且应该是常量,因为函数中的任何一项都不会更改,加州理工学院页面建议返回类型为常量实例,以禁止某些奇数操作,这在许多情况下也是一种很好的做法。

您的赋值运算符是假的:赋值应该执行的操作是使对象成为常量通过
指向此
的对象与右侧的对象相同。赋值运算符创建一个临时对象并设置此对象。但是,退出赋值运算符时它会消失。此外,您声明赋值运算符返回一个引用,该引用通常返回对
*此
的引用,但这里没有退路 声明

除非我有很好的理由去做不同的事情,否则我会用复制构造函数、析构函数和一个
swap()
函数来实现赋值运算符:

VecXd& VecXd::operator=(VecXd rhs) 
{
    this->swap(rhs);
    return *this;
}
调用复制构造函数来创建要运行的参数,很好地复制对象。然后,新创建的副本与分配给它的对象的内容进行交换,并且在返回
*此
后,为
rhs
创建的临时对象的析构函数将释放原始内容。所需的一切红色是一个相对的函数
swap()

swap()
函数假定这两个成员当然可以交换。因为我还没有看到您对
VecXd
的声明,所以我无法判断这是否可行,但通常应该可以


我还没有真正看过你的加法操作符。

你的赋值操作符是假的:赋值应该做的操作是使这个
指向的对象与右边的对象相同。赋值操作符创建一个临时对象并设置这个对象。但是,当正在使用赋值运算符。此外,您声明赋值运算符返回一个引用,该引用通常返回对
*this
的引用,但没有返回 声明

除非我有很好的理由去做不同的事情,否则我会用复制构造函数、析构函数和一个
swap()
函数来实现赋值运算符:

VecXd& VecXd::operator=(VecXd rhs) 
{
    this->swap(rhs);
    return *this;
}
调用复制构造函数来创建要运行的参数,很好地复制对象。然后,新创建的副本与分配给它的对象的内容进行交换,并且在返回
*此
后,为
rhs
创建的临时对象的析构函数将释放原始内容。所需的一切红色是一个相对的函数
swap()

swap()
函数假定这两个成员当然可以交换。因为我还没有看到您对
VecXd
的声明,所以我无法判断这是否可行,但通常应该可以


我还没有真正研究过你的加法运算符。

运算符+
应该是用
运算符+=
来表示的。我有+=用于单独的操作,按照你说的做,编译器就可以了