2012-05-28 21 views
0

我有一個設計問題。我被要求爲某個問題規劃一個設計,在那裏我需要一些列表,還有一個隊列(我需要自己創建,STL是不允許的)。爲了使實現更高效,我想創建一個通用列表,如下所示:創建一個包含指向'Data'的空指針的節點,一個空類。那麼,我想創建一個列表或一個隊列(是語法正確的最後一個句子?)的任何類,我只是將它作爲數據的一個子類。這是製作通用列表(我認爲)的唯一方法,因爲我們不允許使用void *。 當我想在特定列表中使用特定類的某種方法時,問題就開始了。我不能這樣做,因爲'數據'不知道這個功能。在Data中創建虛擬函數是反邏輯和醜陋的,我們也不允許使用任何向下轉換。 有沒有辦法使用通用ADT來解決這個問題?或者我必須創建具體的列表? 非常感謝! 編輯:我們也不允許使用模板。使用通用的ADT

+1

模板是非常建立在C++中,沒有子類化通用數據結構的正規途徑。 – leftaroundabout

回答

0

關於列表和隊列,也許你可以採用由STL採取了同樣的方法:只需要創建列表,然後堆棧,如列表中,你只能推,然後從彈出結束的適配器。

關於那些約束上,這似乎是嚴厲的,不要我想,其目的是供您使用的模板?

不是創建和空類,如果不包含任何方法不爲你所有,使用模板如下面的例子:

template<typename T> 
class List { 

    class Node { 
    public: 
     Node(T* d) 
      { data.reset(new Data(d)); } 
     T * getData() 
      { return data; } 
     Node * getSig() 
      { return sig; } 
    private: 
     std::auto_ptr<T> data; 
     Node * sig; 
    }; 

    List()... 
// Lots of more things... 
}; 

你可以在這裏找到更多的信息:

http://www.cplusplus.com/doc/tutorial/templates/

希望這會有所幫助。

+0

在這種情況下請注意auto_ptr。你確定當涉及到默認的拷貝構造函數和賦值操作符時它會正常運行。另外,重新實現標準庫有什麼意義? –

+0

哦,我們也不允許使用模板。確實是非常嚴厲的。但也許這是有原因的。從鍛鍊的常見問題解答摘自:「Q:我可以使用模板 ?答:不會,我會解釋你在代碼審查會議爲什麼,即使是允許的,它不會一直爲設計的工具。」有沒有其他方法? – nodwj

+0

@Alessandro,你應該仔細檢查操作中的問題。然後你就可以自己回答你的問題。 – Baltasarq