[英]struct reference and operator=
我有这样的课:
template <class T>
class bag
{
private:
typedef struct{T item; unsigned int count;} body;
typedef struct _node{_node* prev; body _body; _node* next;}* node;
struct iterator{
enum exception{NOTDEFINED, OUTOFLIST};
body operator*();
explicit iterator();
explicit iterator(const iterator&);
iterator& operator=(const iterator&);
iterator& operator++(int);
iterator& operator--(int);
bool operator==(const iterator&) const;
bool operator!() const;
private:
node current;
friend class bag;
};
node head;
node foot;
iterator _begin;
iterator _end;
/* ... */
public: /* ... */
bag();
const iterator& begin;
const iterator& end;
};
在bag()中,我必须将引用设置为_begin,结束于_end。
begin = _begin;
end = _end;
但我认为这条线
begin = _begin;
调用bag :: iterator :: operator =()函数。
我如何避免这种情况?
引用无法分配,只能初始化。 因此,您将需要在构造函数的初始化列表中对其进行初始化:
bag() : begin(_begin), end(_end) {}
但是,使用访问器函数而不是公共引用来获取它们是更常规的做法(并且还减少了类的大小):
const iterator& begin() {return _begin;}
const iterator& end() {return _end;}
使用初始化列表:
bag::bag() : begin(begin_), end(end_)
{
}
正如Mike所说,您必须在声明它的地方初始化一个引用,此后您将无法更改它。 如果在构造对象后不必修改引用,则初始化程序列表是最惯用的解决方案,但是在您预见到必须更改它们的情况下,仍然有很好的旧指针:
public: /* ... */
bag();
iterator *begin;
iterator *end;
包含引用成员的类实际上变得不可分配(因为无法重新引用)。
您的Bag似乎在多个成员中复制相同的数据(额外的负担,以使重复的值保持同步)。
相反,您可以执行标准库的操作:通过begin()
和end()
方法的值创建并返回迭代器。
template <class T>
class bag
{
struct node { /*...*/ }
/* ... */
node* head; //why would you want to typedef away that these are pointers?
node* tail;
public:
class iterator {
iterator(node*);
/* ... */
};
iterator begin() { return iterator(head); }
iterator end() { return iterator(tail); }
//also you might need const_iterators
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.