轉錄一個大家也都可能遇到的問題...
如果你有遇到
: compile error 寫說
: 從類型 「const BSTree<AdtTestObj>* const」 到類型 「BSTree<AdtTestObj>*」 的
?
: 換無效
: 初始化引數 2,屬於 「BSTree<T>::iterator::iterator(BSTreeNode<T>*,
: BSTree<T>*) [with T = AdtTestObj]」
可能有小雷,不想看請按左鍵離開
===================================================
嗯, begin() and end() 不是 const 的確不太好...
要是我可能會龜毛的打死也不把 const 拿掉... XD
其實 iterator 裏去存 _tree 也不是很有效率的寫法 (我猜得沒錯的話, 每次
li++, li-- 都要 find 一下?)... 不過可能是比較好寫的作法.
所以我想你的寫法是 OK 啦, 要解決你的問題, 妳可以試試:
iterator begin() const {
if(_root==0) return iterator(0, const_cast<BSTreeNode<T>*>(this));
BSTreeNode<T>* temp = findMin(_root);
return iterator(temp, const_cast<BSTreeNode<T>*>(this));
}
: 我的binary search tree已經寫完了也測試成功
: 但是之前在寫的過程中有遇到一個問題,我覺得我的解決方式不是很好
: 因此想請問老師:
: 我的 BSTree::iterator 內有兩個 private data member:
: BSTreeNode<T>* _node;
: BSTree<T>* _tree;
: constructor 則是:
: iterator(BSTreeNode<T>* n= 0, BSTree<T>* p= 0): _node(n), _tree(p) {}
: iterator(const iterator& i) : _node(i._node), _tree(i._tree) {}
: 但是這樣在 begin()、end()的地方會發生compile error:
: iterator begin() const { if(_root==0) return iterator(0, this);
: BSTreeNode<T>* temp = findMin(_root);
: return iterator(temp, this); }
: iterator end() const { return iterator(0, this); }
: compile error 寫說
: 從類型 「const BSTree<AdtTestObj>* const」 到類型 「BSTree<AdtTestObj>*」 的轉
: 換無效
: 初始化引數 2,屬於 「BSTree<T>::iterator::iterator(BSTreeNode<T>*,
: BSTree<T>*) [with T = AdtTestObj]」
: 因此我把constructor改成
: iterator(BSTreeNode<T>* n= 0, const BSTree<T>* p= 0): _node(n), _tree(p) {}
: 且把data member改成 const BSTree<T>* _tree;
: 這樣就不會有error
: 但是我在overload operator=的時候 需要把 傳進去的iterator的_tree 一起copy
: 如此才能讓
: BSTree::iterator li;
: li = bst.begin();
: 是合法的
: (雖然在老師的adtTest.h裡面好像沒有這種問題
: 因為 AdtType<AdtTestObj>::iterator li = _container.begin();
: 應該是呼叫copy constructor? )
: 因此 iterator 的 data member (BSTree<T>* _tree;) 不應該是const
: 但是不加const compile又不會過 (在costructor會有compile error)
: 後來我的解決方法是:
: 維持原本的寫法
: 把 begin() 、 end()的 const 去掉 就OK了
: 但是以標準來說這兩個應該要是const method吧
: 不知道有沒有比較好的解決方法呢?
: 還是其實我的理解有不對的地方?
: 非常謝謝老師喔~
--
※ 編輯: ric2k1 來自: 61.224.42.19 (12/04 22:09)
1F:→ ysho:const BSTree<T>* _tree是說_tree指到的東西是const 12/04 22:41
2F:→ ysho:不代表_tree本身是const,所以overload operator=是沒問題的 12/04 22:43
3F:→ ilway25:推樓上 12/04 23:27
4F:推 herbert570:我也在 const 上花了一些時間.... 12/05 01:27
5F:→ herbert570:請愛用 BSTree<T> const *, pointer to const BSTree 12/05 01:27
6F:推 a3785lexx:我怎麼都沒想到要直接把整棵Tree給存起來! 12/05 04:33