2011-07-28 187 views
0

我有一個非模板化類(Par_list_elem),我想給它的內部訪問類Par_list(構建一個入侵列表)。超類的模板朋友

問題:我需要Par_list_elem和所有的子類都可以訪問Par_list。詳細地說,唯一需要訪問的字段是_next和_prev;明確限制到這些字段會很好,但不是必需的。

我在做這個做了一些初步的嘗試,其中最新的是以下:

 template <class T> class Par_list { 
      public: 

        Par_list() : _head(0) {} 
        ~Par_list(); 

        //Insert element into list 
        bool insert(T elem); 


        //Remove element identified by iterator 
        void erase(iterator itr); 

      private: 
        T* _head; 
    }; 


    class Par_list_elem { 
      public: 
        Par_list_elem() : _next(0), _prev(0) {} 
        //Get next element in list 
        Par_list_elem* next() { return _next; } 

      private: 
        Par_list_elem* _next; 
        Par_list_elem* _prev; 

        template <typename> friend class Par_list; 
    }; 




    template <class T> void Par_list<T>::erase(Par_list<T>::iterator itr) { 

     T* e = *itr; 

     T* p; 
     if ((p = e->_prev) != 0) 
       p->_next = e->_next; 
     else 
       _head = e->_next; 

     if ((e->_next) != 0) 
       (e->_next)->_prev = p; 

     delete e; 
    } 

    template <class T> bool Par_list<T>::insert(T* nelem) { 

     T* curr = _head; 
     if (curr != 0) { 
       while (curr->_next != 0) 
         curr = curr->next(); 
       curr->_next = nelem; 
     } else 
       _head = nelem; 

     nelem->_prev = curr; 
     nelem->_next = 0; 

     return true; 
} 

TEST.CPP

#include "parsnip_list_back.h" 

class elem : parsnip::Par_list_elem { 
    int _elem; 
}; 

int main (int argc, char** argv) { 

    parsnip::Par_list<elem> plist; 

    return 0; 
} 

有些信息似乎可以在這裏找到: Template friend 但是我的目標不同於足夠的細節,我被困住了。

謝謝!

-------- --------- UPDATE

誤差的以下排序發生用於Par_list_elem的私有成員的接入每個實例。我正在編譯gcc 4.4。

parsnip_list_back.h:66: error: ‘parsnip::Par_list_elem* parsnip::Par_list_elem::_prev’ is private 
parsnip_list_back.h:124: error: within this context 

因此,在目前的實施情況下,即使超類也沒有放棄它的私有。

+0

這真的沒有道理;你說你需要訪問「所有的子類」,但是你只需要訪問基類中定義的字段 - 這正是你的代碼中的'friend'聲明給你的。究竟是什麼問題? –

+0

Par_class無法訪問Par_list_elem的子類的_next和_prev字段。那有意義嗎? – bcr

+0

它應該是能夠的,因爲它們是具有'friend'聲明的類的成員,而不是子類的成員,並且當我嘗試它時它就成功了。你使用什麼編譯器?你遇到了什麼錯誤?你可以發佈一個'Par_list_elem'的子類的示例,並且'Par_list'中的一些代碼試圖訪問這些成員之一? –

回答

1

問題是,您從Par_list_elem私下繼承。所以,雖然Par_list可以訪問基類的私有成員,但它不能訪問基類本身。

我需要Par_list_elem所有它的子類的是訪問Par_list

這將解決問題,如果它是可能的,但它不能完成;友誼不是遺傳的。

最簡單的解決方案是公開繼承。

+0

所以這個想法是因爲elem公開繼承,所以Par_list保證原始的private _next和_prev字段不會被子類修飾,所以它是o.k.爲Par_list使用它們?另外:非常感謝!像魅力一樣工作。 – bcr

+0

好的,我最後的評論很混亂。由於唯一的基類成員(爲簡單起見忽略next())是私有的,所以成員可訪問性不會被繼承訪問說明符修改。那麼只有公共繼承才能提供對基類本身的訪問?並且訪問基類本身是恢復基類的朋友的唯一方法? – bcr