模板中的转换从类继承基类到基础

时间:2016-05-09 08:07:55

标签: c++

我的节点是带有链接列表的模板。我想在我的餐厅项目中创建一个项目使用节点列表,如链接列表与参考计数器,特殊继承饮料和食用。项目的bevrage和食物继承。 我有一个菜单,包括所有这三个类的菜,我需要更改或添加菜与我的经理。我遇到了问题,因为我无法将类从node<Item>*转换为基类。

我想使用函数addNewtItem();

#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

从这个班级打电话

#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

这是带有链接列表的节点类

我想使用此功能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

1 个答案:

答案 0 :(得分: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;