运算符重载C ++ for operator +和operator =

时间:2013-09-18 23:24:00

标签: c++ vector operators overloading

我整天都在为操作符重载而烦恼,我的operator +函数正确计算数据,但我需要将temp类的数据传递给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;
    }
}

任何想法?不要苛刻......哈哈.....:l

2 个答案:

答案 0 :(得分:1)

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

除非我有充分的理由以不同的方式进行,否则我会根据复制构造函数,析构函数和swap()函数实现赋值运算符:

VecXd& VecXd::operator=(VecXd rhs) 
{
    this->swap(rhs);
    return *this;
}

调用复制构造函数来创建函数的参数,很好地复制对象。然后,新创建的副本与分配给的对象的内容交换,并且在返回*this之后,由rhs创建的临时对象的析构函数释放原始内容。所需要的只是一个相对函数swap()

void VecXd::swap(VecXd& other)
{
     std::swap(this->dimension, other.dimension);
     std::swap(this->vecArr, other.vecArr); 
}

swap()函数假设当然可以交换这两个成员。由于我没有看到你的VecXd声明,我无法判断这是否有效但通常应该有效。

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

答案 1 :(得分:0)

这个Caltech C++ Operator Overloading Page应该包含您需要的一切,并对所涉及的逻辑进行相对清晰的解释。您无需遵守其中规定的规则和指南,但在一般情况下它们运作良好。

在算术运算符的特定情况下,操作通常根据+ =运算符定义,如chris对原始帖子的评论中所述。这意味着您通常传入左右参数,复制lhs,并使用lhs_copy + = rhs查找结果;考虑到这一点,更容易避免代码重复;你只需要在+ =中创建一次加法逻辑,然后在+。

中调用它

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

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

您的输入可以且应该是const,因为函数中的任何项都不会被更改,并且Caltech页面建议返回类型为const实例以禁止某些奇数操作,这在许多情况下也是很好的做法。