C++中能不能用结构体模板
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 destructor void 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 参考技术A
注意只有在定义结构体时那个模板名不需要加模板参数列表<T>,之后应用该模板都应该加<T>
如这里的node<T>
#include <iostream>
#include <stdlib.h>
using namespace std;
template <class T>
struct node
T data;
node<T>* next;
;
template <class T>
node<T>* CreateList(int len, T a[])
node<T>* head = new node<T>;
node<T>* tmp = head;
for (int i = 0; i < len; i++)
tmp->data = a[i];
if (i == len - 1)
tmp->next = NULL;
continue;
node<T> * newNode = new node<T>;
tmp->next = newNode;
tmp = newNode;
return head;
template <class T>
void Show(node<T>* head)
for (node<T> * tmp = head; tmp!= NULL; tmp = tmp->next)
cout << tmp->data << " ";
cout << endl;
int main()
int a[3] = 1,2,3;
node<int>* head = CreateList(3, a);
Show(head);
return 0;
参考技术B 我觉得可以这样:template <typename T>
struct Node
T data;
Node* next;
;
C++ SOCKET发送结构体及接收
结构体如下
typedef struct user
char name[10];
int age;
bool sex;
user;
赋值如下
user student
strcpy(student.name,"小明");
student.age=14;
student.sex=TRUE;
我要做什么后才能
还有就是服务器发送是WSASend
客户端接收是WSARecv
如果是转存到BYTe数组里,应该怎么做呀,请大侠们贴一下具体的代码,光说我不知道怎么写呀,我菜鸟呀,谢谢了!
没人知道的吗
user student
strcpy(student.name,"小明");
student.age=14;
student.sex=TRUE;
buffer = (BYTE*)malloc(sizeof(user));
BYTE *p;
p = (BYTE*)(&student);
for(int i = 0; i<sizeof(user); i++)
buffer[i] = p[i];
buffer[i] = 0;本回答被提问者采纳
以上是关于C++中能不能用结构体模板的主要内容,如果未能解决你的问题,请参考以下文章