C++使用类模板定做

书上的代码都会有问题```
泪```
#include<iostream>
using namespace std;
template<typename T>
struct Node{
Node(T&d):c(d),next(0),pref(0){}
T c;
Node*next,*pref;
};
template<typename T>
class List{
Node<T>*first,*last;
public:
List();
void add(T&c);
void remove(T&c);
Node<T>*find(T&c);
void print();
~List();
};
template<typename T>
List<T>::List():first(0),last(0){}
template<typename T>
void List<T>::add(T&n){
Node<T>*p=new Node<T>(n);
p->next=first,first=p;
last?p->next->pref:last=p;
}
template<typename T>
void List<T>::remove(T&n){
Node<T>*p=find(n);
if(!p)return;
p->next?p->next->pref:last=p->pref;
p->pref?p->pref->next:first=p->next;
delete p;
}
template<typename T>
Node<T>*List<T>::find(T&n){
for(Node<T>*p=first;p;p=p->next)
if(p->c==n)return p;
return 0;
}
template<typename T>
List<T>::~List(){
for(Node<T>*p;p=first;delete p)
first=first->next;
}
template<typename T>
void List<T>::print(){
for(Node<T>*p=first;p;p=p->next)
cout<<p->c<<" ";
cout<<"\n";
}
class Cat{
string name;
public:
Cat(const string&n):name(n){}
bool operator==(const Cat&c){return name==c.name;}//?
friend ostream&operator<<(ostream&o,const Cat&c){o<<c.name;}
};
template<>
class List<Cat>{
Node<Cat>*first,*last;
public:
List();
void add(Cat&c);
void remove(Cat&c);
Node<Cat>*find(Cat&c);
void print();
~List();
};
List<Cat>::List():first(0),last(0){}
void List<Cat>::add(Cat&n){
if(find(n))return;
Node<Cat>*p=new Node<Cat>(n);
p->next=first,first=p;
last?p->next->pref:last=p;
}
void List<Cat>::remove(Cat&n){
Node<Cat>*p=find(n);
if(!p)return;
p->next?p->next->pref:last=p->pref;
p->pref?p->pref->next:first=p->next;
delete p;
}
Node<Cat>*List<Cat>::find(Cat&n){
for(Node<Cat>*p=first;p;p=p->next)
if(p->c==n)return p;
return 0;
}
List<Cat>::~List(){
for(Node<Cat>*p;p=first;delete p)
first=first->next;
}
void List<Cat>::print(){
for(Node<Cat>*p=first;p;p=p->next)
cout<<p->c<<" ";
cout<<"\n";
}
int main(){
List<Cat>cList;
cList.add(string("alice"));//?
cList.add(string("luise"));//?
cList.add(string("luise"));//?
cList.print();
List<int>iList;
iList.add(5);//?
iList.add(8);//?
iList.add(8);//?
iList.print();
}
有?的地方有问题```
By the way```
在if()的()内定义Node<T>*p无法通过```
Node<T>为类模板```
什么情况下会发生此事呢?
PS:用的是VC++2008.

第1个回答  推荐于2016-01-23
主要有3个错误:
1).使用string 的操作符,没有加载头文件,即:include <string>
2).List<Cat> 中的add函数原型声明是:void add(Cat&c);参数是Cat对象的引用。而在main方法中,却是用的string类型的实际参数,造成参数的不匹配。
3).List<T>中的add函数原型声明是:void add(T&c);参数是对T类型的引用。而main函数中,用常量作为实参是不对的。如果都用变量是可以用引用的。

程序修改如下:
#include <iostream>
#include <string>
using namespace std;

template<typename T>
struct Node
{
Node(T&d):c(d),next(0),pref(0){}
T c;
Node*next,*pref;
};

template<typename T>
class List
{
Node<T>*first,*last;
public:
List();
void add(T c);
void remove(T&c);
Node<T>*find(T&c);
void print();
~List();
};

template<typename T>
List<T>::List():first(0),last(0){}

template<typename T>
void List<T>::add(T n)
{
Node<T> *p=new Node<T>(n);
p->next=first,first=p;
last?p->next->pref:last=p;
}

template<typename T>
void List<T>::remove(T&n)
{
Node<T>*p=find(n);
if(!p)
return;
p->next?p->next->pref:last=p->pref;
p->pref?p->pref->next:first=p->next;
delete p;
}

template<typename T>
Node<T>* List<T>::find(T&n)
{
for(Node<T>*p=first;p;p=p->next)
if(p->c==n)
return p;
return 0;
}

template<typename T>
List<T>::~List()
{
for(Node<T>*p;p=first;delete p)
first=first->next;
}

template<typename T>
void List<T>::print()
{
for(Node<T>*p=first;p;p=p->next)
cout<<p->c<<" ";
cout<<"\n";
}

class Cat
{
string name;
public:
Cat(const string&n):name(n){}
bool operator==(const Cat&c){return name==c.name;}//?头文件使用要:include <string>
friend ostream& operator<<(ostream&o,const Cat&c){o<<c.name;return o;}
};

template<>
class List<Cat>
{
Node<Cat>*first,*last;
public:
List();
void add(Cat&c);
void remove(Cat&c);
Node<Cat>* find(Cat&c);
void print();
~List();
};

List<Cat>::List():first(0),last(0){}

void List<Cat>::add(Cat&n)
{
if(find(n))
return;
Node<Cat>*p=new Node<Cat>(n);
p->next=first,first=p;
last?p->next->pref:last=p;
}

void List<Cat>::remove(Cat&n)
{
Node<Cat>*p=find(n);
if(!p)
return;
p->next?p->next->pref:last=p->pref;
p->pref?p->pref->next:first=p->next;
delete p;
}

Node<Cat>* List<Cat>::find(Cat&n)
{
for(Node<Cat>*p=first;p;p=p->next)
if(p->c==n)
return p;
return 0;
}

List<Cat>::~List()
{
for(Node<Cat>*p;p=first;delete p)
first=first->next;
}

void List<Cat>::print()
{
for(Node<Cat>*p=first;p;p=p->next)
cout<<p->c<<" ";
cout<<"\n";
}

int main()
{
List<Cat> cList;
cList.add(Cat("alice"));//?add函数的参数是对Cat类的对象的引用,原来,却使用的是字符串对象。
cList.add(Cat("luise"));//?同上
cList.add(Cat("luise"));//?同上
cList.print();

List<int>iList;
iList.add(5);//?对常量不能进行数据引用,可以把原函数的参数传递方式改为传值。
iList.add(8);//?同上
iList.add(8);//?同上
iList.print();

return 0;
}本回答被提问者采纳

C++实现:2.用类模板设计一个栈类stack,其中有两个私有数据成员s数组...
class Stack { private:enum {NUM=10};type * s;int stacksize;int top;public:Stack(int ss=NUM);~Stack(){delete[] s;} Stack(const Stack& st);Stack& operator=(const Stack& st);bool isempty(){return top==0;} bool isfull(){return top==stacksize;} bool push(type& item...

用C++编写一个使用类模板对数组进行排序、查找和求元素和的程序_百度...
include<iostream> using namespace std;\/\/类模板 template<class T> class vector { public:void sort(T a[],int n);T sum(T a[],int n);int search(T e, T a[], int n);};\/\/排序 template<class T> void vector<T>::sort(T a[],int n){ T temp;bool exchange;for(int ...

C++:用类模板编写求 3个数中最大值的程序.
class max3{ T _v1,_v2,_v3;max3(T v1 ,T v2 ,T v3):_v1(v1),_v2(v2),_v3(v3){} getMax(){ return std::max(std::max(_v1,_v2),_v3);} int main(){ cout<<max3(1,3,5).getMax()<<endl;}

比较二个数的大小,用C++类模板做,谢谢!我在线等
include <iostream> using namespace std;\/\/模板声明 template<class T> T myMax(const T &a,const T &b);template<class T> T myMin(const T &a,const T &b);int main(){ int a = 3;int b = 5;cout<<"最大的是:"<<myMax(a,b)<<endl;cout<<"最小的是:"<<myMin(a,b...

c++ 用模板类创建一个单向链表 实现链表节点的增加、删除、输入 怎么写...
传递的参数是节点的数据 T remove(); \/\/移除当前节点后面一个节点,并返回删除节点的数据 void setFirst(); \/\/当前指针作为了头指针 void next(); \/\/让当前指针指向下一个 void prev(); \/\/使得当前指针 移向前一个节点 int length(); \/\/求链表的长度 void setPos(const int...

C++:用类模板编写求 3个数中最大值的程序.
class MAX { private:T x,y,z,max;public:MAX(T a,T b,T c){ x=a;y=b;z=c;} T max1(T a,T b,T c){ if(a>=b&&a>=c) return a;else if(b>=c) return b;else return c;} };void main(){ int a,b,c;cout<<"请输入三个整数:"<<endl;cin>>a>>b>>c...

c++创建链表为什么要用类模板
比如用C++创建链表,用模板就可以创建字符串链表,也可以是整型或浮点型的等;不然就要各自编写一下链表类的程序了,但是它们的数据结构却是相同的。不过要是用VC++写类模板有个问题——不能够分离编译,即类的头文件(.h)和源文件(.cpp)不可以分开,而C++一般是强调分离编译,在头文件声明,源文件...

【Example】C++ Template (模板)概念讲解及编译避坑
C++区别于Java,不提供标准的Object类型,因此不具备完整的泛型编程概念。然而,通过模板,C++支持部分泛型编程。模板是C++中的基础泛型工具,允许开发人员在函数或类中动态定义参数和返回值类型。模板分为函数模板和类模板。函数模板是用于实现同类型变量操作的通用函数,如加法或乘法。通过使用`template>`,...

C++问题:什么叫类模版函数?怎么用呢?
类模板,是对一批仅仅成员数据类型不同的类的抽象,程序员只要为这一批类所组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,(这类可以看作是类模板的实例),从而大大提高编程的效率。模板的类型参数由关键字class 或关键字typename 及其后的标识符构成。在模板参数表中...

C\/C++模板类模板与函数模板区别,以及用法详解
类模板与函数模板在C++编程中扮演着重要角色,它们的语法和使用方法有诸多相似之处,但也有本质区别。类模板是在类的定义中加入类型参数,实现代码的复用和灵活性。具体语法如下:template 类模板名称<类型参数> {成员声明;} 例如:template<typename T> class MyClass {T data;};在这个例子中,T是一...

相似回答
大家正在搜