【问题标题】:c++ abstract base class postfix operatorc++ 抽象基类后缀运算符
【发布时间】:2013-08-12 22:19:44
【问题描述】:

我有一个关于实现共享迭代器接口的问题。

作为 postix 运算符的常见做法,该函数可能如下所示:

IteratorClass operator ++(int) {
  IteratorClass temp = *this;

  //increment stuff

  return temp
}

而且大多数时候这都很好。就我而言,我正在尝试为一个类实现 3 个迭代器。每个迭代器都会加载一个带有数据的本地集合类,但每个派生的迭代器都会以不同的方式加载它。因为集合类是相同的,并且运算符的所有代码(后缀/前缀 ++/--,*)都是相同的,所以我认为实现这一点的好方法是继承:

struct iterator {
  protected:
  Collection collection;
  public:
  operator++(int);
  operator++;
  operator--(int);
  operator--;

  virtual load() = 0;

}

struct iterator1 : public iterator {
  virtual load() { custom load function }
}

struct iterator2 : public iterator {
  virtual load() { custom load function }
}

问题在于后缀运算符...他们试图创建一个抽象类型的对象,然后返回它。对解决方法或结构更改有何建议?

【问题讨论】:

  • 你真的需要后缀操作符吗?因为一般来说,将它们用于迭代器是个坏主意。

标签: c++ inheritance operator-overloading operator-keyword


【解决方案1】:

使用CRTP idiom 使基类知道最终类。例如:

template<typename T>
struct iterator_base {
  public:
  T operator++(int) {
    T temp = static_cast<T&>(*this);
    ++*this;
    return temp;
  }
  T& operator++() {
    // ++ mutation goes here
    return *this;
  }
  // ... likewise for --, etc.
};

struct iterator1: public iterator_base<iterator1> {
  // ... custom load function
};

这种方法称为静态多态,它允许您(在某些情况下)完全避开virtual,从而使您的对象更小。您可以省略基类中的load 声明,并将T::load 称为static_cast&lt;T&amp;&gt;(*this).load()

【讨论】:

  • 酷,感谢您的提示!我已经尝试实现你所说的并链接了它,它几乎就在那里,但现在我坚持,嗯,下一个错误.... 'AVLTree<_k>::BinaryTreeTraversal<_d>' to 'AVLTree<_k _t>::InOrder' 我需要在这里进行某种类型的演员吗?完成后: struct InOrder : public Traversal
  • @kris 错误所在的行是什么?您是否正确声明 operator++(int)operator++() 分别返回 TT&amp;
  • 这是确切的代码,它在第二行失败。 _D 运算符 ++ (int) { _D temp = *this; ++本地;返回温度; } 编辑:这格式不好
  • @kris 在你的后增量运算符中使用++*this 是个好主意,这样增量逻辑就只拼写一次。很难说为什么你的代码没有看到更多的代码就无法编译——我发布的例子就是这样。
  • 它在 Visual c++ 中,也许这就是为什么...... local 是我在“迭代”时隐藏的不同变量。该函数是内联定义的,但我也尝试在外部定义它,同样的问题...错误如下: 错误 2 错误 C2440: 'initializing' : cannot convert from 'libsdk::AVLTree<_k>::BinaryTreeTraversal <_d>' 到 'libsdk::AVLTree<_k>::InOrder'
猜你喜欢
  • 1970-01-01
  • 2012-12-04
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
相关资源
最近更新 更多