2010-12-07 43 views
0

多重繼承我有以下情況:C++從相同的基本模板歧義

我有一個使用在想要被放在一個列表類繼承了ListNode類的List類。

struct _List_node_base 
{ 
... 
void _M_hook(_List_node_base* const __position); 
void unhook(); 
}; 


template<typename _Tp> 
class ListNode : public _List_node_base 
{ 
... 
     typedef _Tp* pointer; 
public: 
pointer GetNext(); 
pointer GetPrev(); 
}; 


template<typename _Tp> 
class List 
{ 
    ... 
}; 

我也有一個HashTable類,類似於列表有一個HashNode類。 HashNode使用ListNode以便放入適當散列槽中的列表中。

template<typename _KeyType, typename _ObjectType> 
    class HashNode : public ListNode<ObjectType> 
    { 
... 
    public: 
      _KeyType GetHashKey() 
    }; 



    template<typename _KeyType, typename _ObjectType, typename _HashFunctionType> 
    class HashTable 
    { 
     //example 

    template<typename _KeyType, typename _ObjectType, typename _HashFunctionType> 
    void HashTable<_KeyType, _ObjectType, _HashFunctionType>::Insert(_ObjectType *object) 
    { 
     uint pos = hashFunction(object->GetHashKey(), tableSize); 

     hashTable[pos].PushBack(object); 
    } 

    }; 

我有一個類,既想列表和可哈希。

class A : public HashNode<SomeKeyType_t, A>, public ListNode<A> 
{ 
... 
}; 

的問題是,編譯抱怨,在List_node_base成員具有A級

無論在哈希類和List類的曖昧的基礎上,他們使用直接ListNode和List_node_base方法在類A上。

基本上,我想讓類A可哈希和列表,但是HashNode的ListNode功能不應暴露在類HashTable的實現之外。

此外,類的要點是它們必須是非侵入性的,動態分配和複製類是不允許的。否則,這將通過創建一個容器類來解決。

+2

按照你的設計,HashNode 已經是ListNode 所以不是「A類:HashNode 」夠了嗎? – MerickOWA 2010-12-07 20:48:30

+1

設計好的容器庫非常困難。發明輪子的理由是什麼?比如說,Boost.Intrusive已經有了非常成熟的侵入式容器實現。 – Stas 2010-12-07 20:59:38

+0

**不要**用下劃線開始您的標識符:[使用下劃線是什麼](http://stackoverflow.com/questions/228783/what-are-the -rules-約-使用-AN-下劃線在-AC-標識符/ 228797#228797)。這個`_List_node_base`(幾乎每個類型或模板參數都是保留的,甚至有幾個參數)被保留供系統使用。 – 2010-12-07 21:21:55

回答

1

我認爲一個更好的設計是爲了避免繼承和使用這樣的事情,而不是:

template <typename _KeyType, typename _ObjectType> 
struct HashEntry { 
    typedef ListNode<HashEntry> Node; 

    _KeyType key; 
    _ObjectType object; 
    ... 
}; 

BTW,_<uppercase-letter>...保留用於執行。你不應該在你自己的符號名稱中使用它。

0

由於HashNode是ListNode的派生類,因此您在對象層次中有兩次相同的「父」類。

避免儘可能多地繼承非抽象類。如果您絕對需要從2個基類繼承的類,則應該重新評估您的設計模式和/或查看您的類可以實現的接口(抽象)類。

3

我不確定我是否喜歡這種設計,但無論如何,您都可以在_List_node_base上使用virtual inheritance來解決您的問題。

0

你可能使用STL/boost容器來保存智能指針(例如boost :: shared_ptr)來解決你的類必須是非複製可構造和非可複製賦值的問題嗎?