【问题标题】:Using binary operator "--" for vector对向量使用二元运算符“--”
【发布时间】:2018-11-25 20:34:27
【问题描述】:

我有自己的向量类,我想创建一个运算符——删除数组中的最后一个元素。但是在我的实现中我得到了一个错误:

二进制“--”:向量没有定义这个操作符或转换为 预定义运算符可接受的类型。

如何正确声明?

class Vector {
private:
    int *vect;
    int size;
public:
    void operator--();
}
void Vector::operator--() {
    int *tmp = vect;
    size--;
    vect = new int(size);
    for (int i = 0; i < size; i++) vect[i] = tmp[i];
    delete[] tmp;
}

【问题讨论】:

  • 是怎么声明的?
  • @tkausl void operator--();
  • 在问题中发布您的代码。
  • @pookeeshtron Please read the following.
  • 即使你修正了声明,实现仍然是错误的。 new int(size) 需要改为 new int[size]。并且代码没有考虑size 为0 的可能性,或者new 抛出异常的可能性。实际上,根本不需要重新分配vect,如果您只是将capacity 成员添加到类中,那么减少size 本身就足够了,因此分配的大小可以不同于填充的大小。跨度>

标签: c++ operator-overloading


【解决方案1】:

我应该这样声明:

void operator--(int);

并像这样实现:

void Vector::operator--(int) {
    if (size>1) size--;
    else std::cout << "Only one element in vector.\n";
}

this (int) 帮助编译器区分前缀和后缀的递增或递减。

一个例子:

struct A {
    void operator --(int) { std::cout << "Postfix\n"; }
    void operator --() { std::cout << "Prefix\n"; }
};

int main()
{
    A a;
    a--;
    --a;
}

感谢@PaulMcKenzie 提供link

【讨论】:

  • 如果有人想调用 u = v--; ?
  • @TungLeThanh 我们应该返回 Vector 而不是 void。
猜你喜欢
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
相关资源
最近更新 更多