【问题标题】:Operator overloading C++ for operator+ and operator=运算符重载 C++ 中的 operator+ 和 operator=
【发布时间】:2013-09-18 23:24:00
【问题描述】:

我整天都在为运算符重载而摸不着头脑,我的 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

【问题讨论】:

  • operator+ 应该是operator+=
  • 我有 += 用于单独的操作,做你说的让编译器自己要求 operator+ 和 operator= :/
  • 我的意思见operator overloading

标签: c++ vector operators overloading


【解决方案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 的声明,我无法判断这是否可行,但通常应该可行。

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

【讨论】:

  • 感谢 Dietmar 提供的信息,但我还是遇到了一些麻烦...我正在使用模板类并实现了交换功能和 operator=,但无法匹配operator= 问题,唯一似乎解决的问题是将 const 添加到 operator=(const VecXd& rhs) 但这会给交换带来问题,您能帮忙吗?
【解决方案2】:

这个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 实例以禁止某些奇怪的操作,这在许多情况下也是一种好习惯。

【讨论】:

  • 引用加州理工学院网站的一句话:“你必须检查自我分配!”这表明了无知:任何实际上依赖于自赋值检查的赋值运算符(即,删除检查会使自赋值的逻辑错误)几乎 100% 的机会不是异常安全的!同样,通过const 返回结果会禁用结果被移动的可能性,这是一个愚蠢的想法。虽然它会使界面略微不对称,但我也会按值采用左侧参数,以潜在地支持对临时值的复制省略。
猜你喜欢
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多