请问一下关于模板的有关问题,必须这样写吗,不会太麻烦么
请教一下关于模板的问题,必须这样写吗,不会太麻烦么
程序很简单,两个模板类,一个是节点类,一个是链表类,一开始我在链表类里面写的都是node,然后编译器报错,于是我都改成了node<T>这才对……,必须这样写么?
------解决方案--------------------
嵌套类的例子,对你的代码改了一下:
template <typename T>
class list
{
public:
struct node
{
T data;
node *next;
public:
node(T d = 0) :data(d), next(NULL){}
friend class list;
};
list() :head(NULL){}
void push(T data){
node *s = new node(data);
if (!head){
head = s;
return;
}
node *p = head;
while (p->next)
p = p->next;
p->next = s;
}
void print()
{
node *p = head;
while (p)
{
cout << p->data << endl;
p = p->next;
}
}
private:
node *head;
};
int main()
{
list<int> a;
a.push(1);
a.push(2);
a.push(3);
a.push(5);
a.print();
return 0;
}
------解决方案--------------------
就是嵌套类嘛。在大类里面再定义一个小类。就能使用同一模板T了。小类也要加分号,就这些注意的地方。还有就是友元会破坏封装。使用的时候要慎重。
#include<iostream>
using namespace std;
template <typename T>
class node
{
T data;
node *next;
public:
node(T d = 0) :data(d), next(NULL)
{
}
template<typename T> friend class list;
};
template <typename T>
class list
{
public:
list() :head(NULL)
{
}
void push(T data);
void print();
private:
node<T> *head;
};
template <typename T>
void list<T>::push(T data)
{
node<T> *s = new node<T>(data);
if (!head)
{
head = s;
return;
}
node<T> *p = head;
while (p->next)
{
p = p->next;
}
p->next = s;
}
template <typename T>
void list<T>::print()
{
node<T> *p = head;
while (p)
{
cout << p->data << endl;
p = p->next;
}
}
int main()
{
list<int> a;
a.push(1);
a.push(2);
a.push(3);
a.push(5);
a.print();
}
程序很简单,两个模板类,一个是节点类,一个是链表类,一开始我在链表类里面写的都是node,然后编译器报错,于是我都改成了node<T>这才对……,必须这样写么?
------解决方案--------------------
嵌套类的例子,对你的代码改了一下:
template <typename T>
class list
{
public:
struct node
{
T data;
node *next;
public:
node(T d = 0) :data(d), next(NULL){}
friend class list;
};
list() :head(NULL){}
void push(T data){
node *s = new node(data);
if (!head){
head = s;
return;
}
node *p = head;
while (p->next)
p = p->next;
p->next = s;
}
void print()
{
node *p = head;
while (p)
{
cout << p->data << endl;
p = p->next;
}
}
private:
node *head;
};
int main()
{
list<int> a;
a.push(1);
a.push(2);
a.push(3);
a.push(5);
a.print();
return 0;
}
------解决方案--------------------
就是嵌套类嘛。在大类里面再定义一个小类。就能使用同一模板T了。小类也要加分号,就这些注意的地方。还有就是友元会破坏封装。使用的时候要慎重。