2016-05-09 89 views
-1

我有節點,它是一個帶鏈接列表的模板。我想在我的餐廳項目中創建一個項目使用節點列表,如鏈接列表與參考計數器,特殊繼承飲料和食用。一個bevrage和食物從項目繼承。 我有一個菜單,包括所有這三個類的菜,我需要改變或添加與我的經理菜。我遇到了一個問題,因爲我無法將這個類從node<Item>*轉換爲基類。從類轉換模板從類繼承基類到基地

我想使用功能addNewtItem();從這個類

#ifndef MENEGER_H 
#define MENEGER_H 
#include "Node.h" 
#include "Waiter.h" 
#include "Menue.h" 
class Meneger: public Waiter 
{ 
    public: 

     Meneger(); 
     ~Meneger(); 
     void editItem (Node<Edible>&  newItem){ _myMenue->addNewtItem(newItem);} 
     void editItem (Node<Special>& newItem){ _myMenue->addNewtItem(newItem);} 
     void editItem (Node<Beverage>& newItem){ _myMenue->addNewtItem(newItem);} 
    protected: 

    private: 
     int _amountTable; 
     int _weiterId; 
     Table* _table; 
     Menue* _myMenue; 
}; 

#endif // MENEGER_H 

#ifndef MENUE_H 
#define MENUE_H 
#include "Node.h" 

class Menue 
{ 
    public: 
     Menue(); 
     Node<Item>* _head; 

     void deleteItem(Node<Item>* item); 
     Node<Item>* getItem(int i); 

     void addNewtItem(Node<Item>& nextNode) {if(_head) _head->addNode(nextNode); else _head=nextNode;} 

     void printMenue(); 
     void deleteItem(int i); 

     ~Menue(); 

    protected: 

    private: 
}; 

#endif // MENUE_H 

調用節點類的鏈接列表

我想要使用此功能operator Node<newType>()但轉換不起作用

#ifndef NODE_H 
#define NODE_H 
#include "Item.h" 
#include "Edible.h" 
#include "Beverage.h" 
#include "Special.h" 

template <class T> 
class Node 
{ 
    public: 

     T* _item; 
     Node* _next; 
     int _refCount; 
     Node():_next(NULL),_refCount(0),_item(NULL){} 
     Node(T* item=0,Node<T>* next=0):_next(next),_item(item),_refCount(1){} 
     ~Node(){ if(_item)delete _item;_item=NULL;} 
     T& operator*(){return *_item;} 
     T* operator->(){return _item;} 
     void addRefCount() {_refCount++;} 
     void addNode(Node<T>* newItem); 
     int removeItem(){return --_refCount;} 
     template<class newType> // template function for 
     operator Node<newType>() // implicit conversion ops. 
     { 
      return Node<newType>(_item); 
     } 

    private: 
}; 


template <class T> 
inline void Node<T>::addNode(Node<T>* newItem) 
{ 
    if(newItem==NULL) 
     return; 
    newItem->_next=_next; 
    _next=newItem; 

} 



#endif // NODE_H 
+2

在這個問題上有JavaScript嗎? – evolutionxbox

+2

問題是什麼? 「不起作用」不足以幫助您:是否有編譯器錯誤消息?運行時期間的不恰當行爲?如果是這樣,你會得到什麼樣的行爲和行爲? – Garf365

回答

0

我不知道這是你要找的問題,但是......這是一個問題。

看那方法Menue::addNewItem()

void addNewtItem(Node<Item>& nextNode) {if(_head) _head->addNode(nextNode); else _head=nextNode;} 

我不知道什麼是Item_head是一個指向Node<Item>。並Node::addNode()收到一個Node<T>Node<Item>,在這種情況下)指針。但是nextNode是一個Node<Item>一個參考,而不是一個指向Node<Item>

所以,當你寫

_head->addNode(nextNode); 

你想一個Node<Item>傳遞給期待指針的方法Node<Item>;當你寫

_head = nextNode; 

你想一個Node<Item>賦給類型指針的一個Node<Item>的變量。

你的意圖是

_head->addNode(&nextNode); 
_head = & nextNode;