C++ 如何在模板中使用智能指针?

C++ 如何在模板中使用智能指针?,c++,codeblocks,dev-c++,C++,Codeblocks,Dev C++,我正在使用模板,但我在将餐厅项目中的食品或饮料转换为模板中的项目时遇到问题??有人知道怎么做吗?? 饮料和可食用食品都是从该项目继承下来的 或者,如果有人有任何想法,以改善我的项目thnks的任何帮助 #ifndef NODE_H #define NODE_H #include "Item.h" #include "Edible.h" #include "Beverage.h" #include "Special.h" enum Type { special ,beverage, edible

我正在使用模板,但我在将餐厅项目中的食品或饮料转换为模板中的项目时遇到问题??有人知道怎么做吗?? 饮料和可食用食品都是从该项目继承下来的 或者,如果有人有任何想法,以改善我的项目thnks的任何帮助

#ifndef NODE_H
#define NODE_H
#include "Item.h"
#include "Edible.h"
#include "Beverage.h"
#include "Special.h"
enum Type { special ,beverage, edible };
template <class T>
class Node
{
    public:

        T* _item;
        Node* _next;
        int _refCount;
        Node():_next(NULL),_refCount(0),_item(NULL){}
        Node(T* item,Node<T>* next):_next(next),_item(item),_refCount(1){}
        ~Node(){    if(_item)delete _item;_item=NULL;}

        friend ostream& operator << (ostream& os,const Node<T>& node){    if(node._item)return  os<<*node._item;else return os<<"";}
        Node<T>*   getNode(int i);
        double getPrice()const {return _item->getPrice();}
        void addRefCount()  {_refCount++;}
        void addNode(Node<T>* newItem);
        void print();
        template<class newType> // template function for
        operator Node<newType>() // implicit conversion ops.
        {
            return Node<It>(this);
        }
        int removeItem(){return --_refCount;}
    private:
};

template <class T>
inline Node<T>*  Node<T>::getNode(int i)
{
    Node<T>* current=this;
    for(i;i>0;i--)
        current=current->_next;
    return current;
}

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

}
template <class T>
inline void Node<T>::print()
{
    Node<T>* head=this;
    /*Print all item until we have null*/
    while(head!=NULL)
    {
        /*Check if there is any item inside*/
        if(head->_item!=NULL)
            cout<<*head->_item<<endl;
        head=head->_next;
    }
}

#endif // NODE_H
\ifndef节点
#定义节点
#包括“项目h”
#包括“可食用的.h”
#包括“饮料.h”
#包括“Special.h”
枚举类型{特殊,饮料,食用};
模板
类节点
{
公众:
T*_项;
节点*\u下一步;
国际参考计数;
Node():_next(NULL),_refCount(0),_item(NULL){}
节点(T*item,Node*next):\u next(next),\u item(item),\u refCount(1){}
~Node(){if(_item)delete _item;_item=NULL;}
friend ostream&运算符_item!=NULL)
coutprint();
_headSpecial->print();
}
void菜单::deleteItem(节点*项)
{
如果(项==NULL)
返回;
如果(!(项目->移除项目())
{
节点*电流;
电流=_;
如果(_==项目)
_头食用=\u头食用->\u下一步;
其他的
{
while(当前!=NULL&&item!=current->\u下一步)
当前=当前->下一步;
如果(当前==NULL)
返回;
当前->\u next=当前->\u next->\u next;
}
删除项目;
}
}
void菜单::deleteItem(节点*项)
{
如果(项==NULL)
返回;
如果(!(项目->移除项目())
{
节点*当前=_;
如果(_=项)
_headBeverage=\u headBeverage->\u next;
其他的
{
while(当前!=NULL&&item!=current->\u下一步)
当前=当前->下一步;
如果(当前==NULL)
返回;
如果(项目!=当前->下一步)
返回;
当前->\u next=当前->\u next->\u next;
}
删除项目;
}
}
void菜单::deleteItem(节点*项)
{
如果(项==NULL)
返回;
如果(!(项目->移除项目())
{
节点*电流=_头专用;
如果(_headSpecial==项目)
_headSpecial=\u headSpecial->\u next;
其他的
{
while(当前!=NULL&&item!=current->\u下一步)
当前=当前->下一步;
如果(当前==NULL)
返回;
如果(项目!=当前->下一步)
返回;
当前->\u next=当前->\u next->\u next;
}
删除项目;
}
}
菜单::~Menue()
{
while(_!=NULL)
如果(!(_->removietem())
{
节点*temp=\u头->\u下一步;
删除(u);;
_头部温度=温度;
}
while(_头饮料!=NULL)
如果(!(_headBeverage->removietem())
{
节点*温度=_头饮料->_下一步;
删除(u);;
_头饮料=温度;
}
while(_headSpecial!=NULL)
如果(!(_headSpecial->removietem())
{
节点*温度=_headSpecial->_next;
删除(u headSpecial);;
_头部特殊=温度;
}
}
Node*Menue::getItem(int i,类型)
{
/*切换我们要订购的正确项目*/
开关(类型)
{
特殊情况:返回->获取节点(i);
打破
案例饮料:退货_headBeverage->getNode(一);
打破
案例:返回_headSpecial->getNode(i);
打破
默认值:返回NULL;
打破
}
}
这是在manue中使用它的函数
Node*Menue::getItem(inti,Type)
如果有人知道如何修复它

Node<Item>* Menue:: getItem(int i,Type type)
这解决了眼前的问题,但不是根本的问题:OP还不了解他们在做什么来编写如此复杂的程序。解决这个问题的方法是阅读更多的教科书,解决一些问题,或者通过示例更好地掌握继承和指针


然后,他们应该再次编写
节点
的链表(
节点::getNode
,例如,可以很容易地运行到列表的末尾),在编写依赖于链表的逻辑之前对其进行完整的测试。试图同时编写一个程序的两个部分通常会将a部分和B部分中的bug数量相乘,而不是为了调试时间而将它们相加。

在您的示例中,您实际在哪里使用智能指针?我试图了解我可以从node中找到谁*我发送继承bev或Obable,但我没有知道该由谁来解决我想知道smart poiner是否能解决它??一个
节点*
。其中一个问题是,您试图将
节点*
返回为
节点*
,但无法返回。它们是不同的东西。你需要重新考虑你的链表实现。智能指针帮不了你。
节点
的智能指针仍然不同于
节点
的智能指针。但物品是可食用和变装的基础,我可以做一些事情??我理解,但如果我得到了物品,我就打破了共享指针的想法,这是所有这些的主要想法。我需要包装器知道何时删除指针。我想使用智能指针,因为它可以使用这样的模板,但我仍然不知道在这种情况下如何知道节点的索引,所以可以编写remove函数在索引处删除节点。您也可以搜索和删除,但是如果没有其他技巧,您不能混合指向不同类型的
节点的指针。创建一个类
BaseNode
,模板化的
节点继承自该类。然后可以将任何类型的
节点
作为
基本节点
传递,但这可能会使事情过于复杂。首先,您如何知道要从三个列表中删除
BaseNode
中的哪一个?有一个计数器可以计算使用量,以提供从菜单中删除adish的动态选项,但该节点的地址仍然在账单中,账单会在需要时使用它
Node<Item>* Menue:: getItem(int i,Type type)
Item * Menue:: getItem(int i,Type type)
{
    /*Switch the correct item we want to order*/
    switch (type)
    {
        case special:return _headEdible->getNode(i)->_item;
        break;

        case beverage:return _headBeverage->getNode(i)->_item;
        break;

        case edible:return _headSpecial->getNode(i)->_item;
        break;

        default: return NULL;
        break;
    }
}