当前位置:编程学习 > C/C++ >>

C++中能不能用结构体模板

我想做一个链栈,按设想,链栈用类模板实现,在类中使用到结构体指针。但结构体中的类型应该可变。不知道有没有结构体模板,如果有,请各位方家写出来看下。

其次,不知道可不可以在结构中再定义一个结构,镶嵌在结构中,并且里面的结构没有预定义。不知道可以不???

答案:当然可以写结构体模版,标准库中的容器都是类(结构体)模版,有vector,list,queue下面是我模仿标准库写的一个Queue(队列),不过其中的接口跟list提供的接口差不多,你只要把所有出现Queue的地方全部换成list就成了,这个程序用到了类模版的很多知识,类模版的前向声明,函数的前向声明,类模版的特化类模版友元函数的设置等等,需要对类模版这块比较熟悉才成
#ifndef QUEUE_H_#define QUEUE_H_#include <iostream>
template<class T> class Queue;
template<class T> std::ostream &operator<<(std::ostream &, const Queue<T> &);
template<class Type> class QueueItem{friend class Queue<Type>;friend std::ostream &operator<< <Type>(std::ostream &, const Queue<Type> &);QueueItem(const Type &it): item(it), next(0) { }Type item;QueueItem *next;};
template<class T>class Queue{friend std::ostream &operator<< <T>(std::ostream &, const Queue<T> &);public:Queue(): head(0), tail(0) { }Queue(const Queue &c);Queue &operator=(const Queue &rhs);template<class Iter> Queue(Iter beg, Iter end):head(0), tail(0) { copy_elements(beg, end); }~Queue(){ destroy(); }public:template<class Iter> void assign(Iter beg, Iter end);void push(const T &);void pop();T &front() { return head->item; }const T &front() const { return head->item; }bool empty() const { return head == 0; }private:QueueItem<T> *head;QueueItem<T> *tail;//utility functions used by copy constructor, assignment and destructorvoid copy_elements(const Queue &);void destroy();private:template<class Iter> void copy_elements(Iter, Iter);};
template<> voidQueue<const char *>::push(const char *const &s){char *new_item = new char[strlen(s) + 1];strncpy(new_item, s, strlen(s) + 1);QueueItem<const char *> *p        = new QueueItem<const char *>(new_item);if(empty())        head = tail = p;else{tail->next = p;tail = p;}}
template<> void Queue<const char *>::pop(){    QueueItem<const char *> *p = head;head = head->next;delete []p->item;delete p;}
template<class T>void Queue<T>::push(const T &v){QueueItem<T> *p = new QueueItem<T>(v);if(empty()){head = tail = p;}else{tail->next = p;tail = p;}}
template<class T> void Queue<T>::pop(){QueueItem<T> *p;p = head;head = head->next;delete p;}
template<class T>Queue<T>::Queue(const Queue &c): head(0), tail(0){copy_elements(c);}
template<class T>void Queue<T>::copy_elements(const Queue &c){for(QueueItem<T> *p = c.head; p; p = p->next)push(p->item);}
template<class T> template<class Iter>void Queue<T>::copy_elements(Iter beg, Iter end){for(; beg != end; ++beg)push(*beg);}
template<class T> template<class Iter>void Queue<T>::assign(Iter beg, Iter end){destroy();copy_elements(beg, end);}
template<class T> void Queue<T>::destroy(){while(!empty())pop();}
template<class T>Queue<T> &Queue<T>::operator=(const Queue &rhs){destroy();copy_elements(rhs);return *this;}
template<class T> inline std::ostream &operator<<(std::ostream &os, const Queue<T> &q){if(q.empty()) return os;QueueItem<T> *p;os << "< ";for(p = q.head; p; p = p->next)os << p->item << " ";os << ">";return os;}
template<> inline std::ostream &operator<<(std::ostream &os, const Queue<const char *> &q){if(q.empty()) return os;QueueItem<const char *> *p;os << "< ";for(p = q.head; p!= q.tail; p = p->next)os << "\"" << p->item << "\"" << ", ";os << "\"" << p->item << "\"" << " >";return os;}
#endif
我觉得可以这样:

template <typename T>
struct Node
{
 T data;
 Node* next; 
};
你可以用C中的方法自己定义啊!结构体是可以嵌套的

上一个:JAVA C++ 选哪个好啊?
下一个:是C/C++ 还是Java好?

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,