| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 960 人关注过本帖
标题:类间函数调用的问题
只看楼主 加入收藏
mapei123
Rank: 2
等 级:论坛游民
帖 子:9
专家分:10
注 册:2010-12-5
结帖率:100%
收藏
 问题点数:0 回复次数:4 
类间函数调用的问题
下面是我建的一个工程,其中tablehead类跟list类几乎一样,就只是将模板类中的Elem换成了Column,另外加了一个find函数,能不能不用再把list中的函数再原样写到tablehead中,而采用类间函数调用的形式?我不会这编这种类型的东西,哪位高手可以示范一下


List类:
#include<iostream>
using namespace std;
template <class Elem>
class Link
    {  public:
              Elem element;
              Link*next;
              Link(const Elem& elemval,Link*nextval=NULL)
                { element=elemval;
                  next=nextval;
                  }
               Link (Link*nextval=NULL)
                 { next=nextval;}
          };
template<class Elem>
class List:public List<Elem>
{ private:
          Link<Elem>*head;
          Link<Elem>*fence;
          Link<Elem>*tail;
          int leftcnt;
          int rightcnt;
          void init()
              {  fence=tail=head=new Link<Elem>;
                 leftcnt=rightcnt=0;
                 }
          void removall()
            { while(head!=NULL)
               {  fence=head;
                  head=head->next;
                  delete fence;
                  }
               }
  public:
         List() {  init();}
         ~List() { removall();}
         void clear() { removall();init();}
         bool insert (const Elem&);
         bool append (const Elem&);
         bool remove (Elem&);
         void setStart();
         void setEnd();
         void prev();
         void next();
         int leftLength()const;
         int rightLength()const;
         bool setPos(int pos);
         bool getValue(Elem& it)const;
         void print()const;
         };

template<class Elem>   
bool List<Elem>::insert(const Elem& item)   //在表内增加结点
{  fence->next=new Link<Elem>(item,fence->next);
   if(tail==fence)  tail=fence->next;
   rightcnt++;
   return true;
   }
template<class Elem>   
bool List<Elem>::append(const Elem& item)    //在表末尾增加结点
{   tail=tail->next=new Link<Elem>(item,NULL);
    rightcnt++;
    return true;
     }
template<class Elem>  
bool List<Elem>::remove(Elem& it)   //删除一个结点
{   if(fence->next==NULL) return false;  //表为空
    it=fence->next->element;
    Link<Elem>*ltemp=fence->next;
    fence->next=ltemp->next;
    if(tail==ltemp) tail=fence;    //如果要删除尾结点
    delete ltemp;
    rightcnt--;
    return true;
     }
template<class Elem>
void List<Elem>::setStart()   //指针指向链表头   
{ fence=head; rightcnt+=leftcnt; leftcnt=0;}
template<class Elem>
void List<Elem>::setEnd()     //指针指向链表尾
{ fence=tail; leftcnt+=rightcnt; rightcnt=0;}
template<class Elem>
void List<Elem>::prev()   //结点向前移一位
{  Link<Elem>*temp=head;
   if(fence==head) return;   //如果fence指向head,则没前驱,不返回任何值
   while (temp->next!=fence) temp=temp->next;   //结点一直往后移,直到temp->next=fence
   fence=temp;
   leftcnt--;
   rightcnt++;
   }
template<class Elem>
void  List<Elem>::next()    //结点向后移一位
{  if(fence!=tail)
     {  fence=fence->next; rightcnt--; leftcnt++;}
     }
template<class Elem>    //fence 左边的长度
int List<Elem>::leftLength()const
{  return leftcnt;}
template<class Elem>    //fence 右边的长度
int List<Elem>::rightLength()const
{  return rightcnt;}
template<class Elem>     
bool List<Elem>::setPos(int pos)   //当前的位置
{ if((pos<0)||(pos>rightcnt+leftcnt))return false;
  fence=head;
  for(int i=0; i<pos; i++) fence=fence->next;
  return true;
  }
template<class Elem>
bool List<Elem>::getValue(Elem&it) const  //当前结点的值
{ if(rightLength()==0)  return false;
  it=fence->next->element;
  return true;
  }
template<class Elem>
void List<Elem>::print()const    //打印结点
{ Link<Elem>*temp=head;
  cout<<"<";
  while (temp!=fence)
  { cout<<temp->next->element>>"";
    temp=temp->next;
    }
    cout<<"|";
    while (temp->next!=NULL)
    {  cout<<temp->next->element<<"";
       temp=temp->next;
       }
       cout<<">\n";
       }

  
Column类:


#include<iostream>
#include<string>
using namespace std;
 class Column
 {
 private:
         string Listname;    //表名
         string Listtype;    //表类型
         int    Listlength;  //表长度
 public:
        Column (string lname,string ltype,int llength);   //构造函数
        string getListname(){return Listname;}
        string getListtype(){return Listtype;}
        int    getListlength(){return Listlength;}
        void print();
 };
  Column::Column(string lname,string ltype,int llength)   //构造函数
 {
   Listname=lname;
   Listtype=ltype;
   Listlength=llength;
 }
 void Column::print()
 {
      cout<<"Name:"<<Listname<<endl;
      cout<<"Type:"<<Listtype<<endl;
      cout<<"Length:"<<Listlength<<endl;
 }
 int main ()
 { string lname,ltype;
   int  llength;
   cout<<"Please input the listname:";
   cin>>lname;
   cout<<"Please input the listtype:";
   cin>>ltype;
   cout<<"Please input the listlength:";
   cin>>llength;
   Column c1(lname,ltype,llength);
   c1.print();   //调用print函数
   system("pause");
   return 0;
   }



   Tablehead类:


#include"column.h"
#include"list.h"
#include<iostream>
using namespace std;
class tablehead
{ private:
          int colnum;
          List<column>*tableheadlist;
  public:
         tablehead();
         ~tablehead();
         void clear();
         bool insert(const column&);
         bool append(const column&);
         bool remove(column&);
         void setStart();
         void setEnd();
         void prev();
         void next();
         int leftLength()const;
         int rightLength()const;
         bool setPos(int pos);
         bool getValue(column&it)const
         bool find();
         void print()const;
         };


搜索更多相关主题的帖子: 函数 
2010-12-05 14:07
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
List<column>*tableheadlist;
想用哪个List类的函数 就用tableheadlist指针指向那个函数就可以啦

                                         
===========深入<----------------->浅出============
2010-12-05 15:36
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
明白了   估计得写   那个类是一个独立的类
只是嵌套了一个对象  不是继承了list类  
所以得重写   但是函数实现可以用那个内嵌子对象的指针来访问内嵌子对象的接口

                                         
===========深入<----------------->浅出============
2010-12-05 15:43
mapei123
Rank: 2
等 级:论坛游民
帖 子:9
专家分:10
注 册:2010-12-5
收藏
得分:0 
回复 3楼 laoyang103
在tablehead.h中:
#include"Column.h"
#include"List.h"
#include<iostream>
using namespace std;
class tablehead
{ private: List<Column>*tableheadList;
。。。。。。
在tablehead.cpp中:
#include"tablehead.h"
template<class Column>   
bool List<Column>::insert(const Column&)   //在表内增加结点
{  tableheadList->insert(const Column&); }
编译的时候报错:tableheadList未声明,我要怎么改呢
2010-12-05 22:16
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
template <class Elem>
class Link
    {  public:
              Elem element;
              Link*next;
              Link(const Elem& elemval,Link*nextval=NULL)
                { element=elemval;
                  next=nextval;
                  }
               Link (Link*nextval=NULL)
                 { next=nextval;}
          };
template<class Elem>
class List:public List<Elem>
{ private:
          Link<Elem>*head;
          Link<Elem>*fence;
          Link<Elem>*tail;
          int leftcnt;
          int rightcnt;
          void init()
              {  fence=tail=head=new Link<Elem>;
                 leftcnt=rightcnt=0;
                 }
          void removall()
            { while(head!=NULL)
               {  fence=head;
                  head=head->next;
                  delete fence;
                  }
               }
看一下上面的的代码  你的List类和它的基类里面都没有tableheadList这个数据成员啊
当然会提示  没有定义  实在不会改  把工程给我  QQ 553069938

                                         
===========深入<----------------->浅出============
2010-12-06 10:04
快速回复:类间函数调用的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025284 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved