【问题标题】:overloading = operator for self made vector class重载 = 自制向量类的运算符
【发布时间】:2017-09-04 20:57:58
【问题描述】:

我开始编写自己的向量类并开始重载 = 运算符。我在下面有类似somevector = someothervector 的代码,尽管我不确定它是否正确,因为我一直坚持为somevector[0] = 5 之类的东西制作另一个重载,用它来给我的向量值。

myVector& myVector::operator=(const myVector &obj)
{
    myVector tem(obj.Size()); //make new empty vector of the needed size then fill below

    for (int i = 0; i <= tem.size; ++i)
    {
        tem.array[i] = obj.array[i]; 
    }

    return tem;
}

对于一个 [] 重载,我有以下内容,它适用于读取向量的元素,但由于它只是返回元素的值,我不知道如何修复它以进行赋值,我认为这可能是我的主要问题。

int myVector::operator[](int ind)
{
    if ( (ind >= 0) && (ind < size) )
    { return array[ind]; }

    return 0;
}

有人可以就此提供一些建议吗?

【问题讨论】:

  • 请启用并注意您的编译器警告。
  • 您从未在myVector::operator= 中调用过myVector::operator[]。如果你打电话给tem[i]obj[i],你会这样做。
  • 您应该在*this 而不是tem 上进行操作,并在赋值运算符的末尾返回*this。您还对临时对象进行操作,然后返回对该临时对象的引用,该临时对象在函数退出时刚刚被破坏。你的编译器应该会警告你。
  • 上面已经说过:如果你在你的operator[]中设置ind unsigned,你不需要检查ind &gt;= 0。而不是返回 0,您可能更喜欢抛出异常。
  • @windy401 您通常会返回对 *this 的引用,以便您可以链接分配调用 (foo = bar = baz)

标签: c++ class vector operator-overloading


【解决方案1】:

您希望在 this 上运行,而不是临时运行。

也就是说,您正在分配给当前对象的数据成员

类似的东西:

myVector& myVector::operator=(const myVector &obj)
{
    // insert appropriate code here to ensure your array's capacity is sufficient
    // to hold obj.size ints

    size = obj.size;
    for (int i = 0; i < size; ++i)
    {
        array[i] = obj.array[i]; 
    }

    return *this;
}

要启用您请求的语法 (somevector[0] = 5),您的数组下标运算符必须返回一个对存储对象的 引用,否则您是在临时操作。如果索引不正确,如果它不存在,您可能希望抛出异常。

int& myVector::operator[](unsigned ind)
{
    if (ind < size)
        return array[ind];

    throw std::out_of_range("invalid index");
}

【讨论】:

  • 如果数组不够大,无法容纳所有 obj 的元素,我是否只需删除 [] 数组,然后 array = new int[obj.size,就像这样,然后继续赋值,或者?
  • @windy401 是的,完全一样。
  • 甜蜜。非常感谢一切。现在一切都变得更有意义了。
猜你喜欢
  • 1970-01-01
  • 2013-11-10
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 2022-07-21
相关资源
最近更新 更多