| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 594 人关注过本帖
标题:[求助]大家帮忙解释错误,谢谢了
只看楼主 加入收藏
dqzwswswws
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2005-10-7
收藏
 问题点数:0 回复次数:3 
[求助]大家帮忙解释错误,谢谢了

是用游标来实现表的头文件,随手写的,所以把类的申明和类的实现都写在一起了,问题主要是友元声明的问题,不声明友元的的话,把node类的成员改成公有的也行。不用模板就没问题,真是搞不懂。我改了好久也没改好,望大家帮帮忙! #include <iostream.h>

class OutOfBounds; class NoMen;

template <class t> class Node { friend Space<t>; //声明友元出现问题 friend Yblist<t>; private: t date; int next; }; ///////////////////////////////////////////////////////////////////////////////////////////////// template <class t> class Space { friend Yblist<t>; //声明友元出现问题 public: Space(int m=100); ~Space() {delete []a;} int Allocate(); void Deallocate(int i); int num,f1,f2; Node<t> *a; };

template <class t> Space<t>::Space(int m) { num=m; a=new Node<t>[num]; f1=0; f2=-1; }

template <class t> int Space<t>::Allocate() { if(f2==-1) { if(f1==num) throw NoMen(); return f1++; } int i=f2; f2=a[i].next; return i; }

template <class t> void Space<t>::Deallocate(int i) { a[i].next=f2; f2=i; } ///////////////////////////////////////////////////////////////////////////////////////////////// template <class t> class Yblist { public: Yblist() {first=-1;} ~Yblist(); int Length() const; bool Retrieve(int k,const t &x) const; int Locate(const t &x) const; Yblist<t> &Insert(int k,const t &x); Yblist<t> &Delete(int k); void Show(ostream &out) const; private: int first; Space<t> s;

};

template <class t> Yblist<t>::~Yblist() { int next; while(first!=-1) { next=s.a[first].next; s.Deallocate(first); first=next; } }

template <class t> int Yblist<t>::Length() const { int len=0; int next=first; while(next!=-1) { next=s.a[next].next; len++; } return len; }

template <class t> bool Yblist<t>::Retrieve(int k,const t &x) const { if(k<1) return false; int next=first,index=1; while(index<k && next!=-1) { next=s.a[next].next; index++; } if(next!=-1) { x=s.a[next].data; return true; } return false; }

template <class t> int Yblist<t>::Locate(const t &x) const { int next=first,index=1; while(next!=-1 && s.a[next].data!=x) { next=s.a[next].next; index++; } return (next!=-1? index: 0); }

template <class t> Yblist<t> &Yblist<t>::Insert(int k,const t &x) { if(k<0) throw OutOfBounds(); int p=first; for(int index=1;index<k && p!=-1;index++) p=s.a[p].next; if(k>0 && p==-1) OutOfBounds(); int y=s.Allocate(); s.a[y].data=x; if(k) { s.a[y].next=s.a[p].next; s.a[p].next=y; } else { s.a[y].next=first; first=y; } return *this; }

template <class t> Yblist<t> &Yblist<t>::Delete(int k) { if(k<1 || first==-1) throw OutOfBounds(); int p=first; if(k=1) first=s.a[first].next; else { for(int index=1;index<k-1 && p!=-1; index++) p=s.a[p].next; if(p==-1 && s.a[p].next==-1) throw OutOfBounds(); int i=s.a[p].next; s.a[p].next=s.a[i].next; } s.Deallocate(i); return *this; }

template <class t> void Yblist<t>::Show(ostream &out) const { for(int p=first;p!=-1;p=s.a[p].next) out<<s.a[p].data<<' '; out<<endl; }

搜索更多相关主题的帖子: 解释 
2005-10-07 21:01
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
#include &lt;iostream&gt;
#include &lt;cstdlib&gt;
using namespace std;

class OutOfBounds;
class NoMen;

//you should first declare these two classes
//so that the class Node can use them
//otherwise the compiler will complain, what
//these two classes are
template &lt;class t&gt;
class Space;

template &lt;class t&gt;
class Yblist;


template &lt;class t&gt;
class Node
{
    friend Space&lt;t&gt;;         
    friend Yblist&lt;t&gt;;
private:
    t date;
    int next;
};

/////////////////////////
template &lt;class t&gt;
class Space
{
    friendYblist&lt;t&gt;;               
public:
    Space(int m=100);
    ~Space() {delete []a;}
    int Allocate();
    void Deallocate(int i);
    int num,f1,f2;
    Node&lt;t&gt; *a;
};

template &lt;class t&gt;
Space&lt;t&gt;::Space(int m)
{
    num=m;
    a=new Node&lt;t&gt;[num];
    f1=0;
    f2=-1;
}

template &lt;class t&gt;
int Space&lt;t&gt;::Allocate()
{
    if(f2==-1)
    {
        if(f1==num) throw NoMen();
            return f1++;
    }
    int i=f2;
    f2=a[i].next;
    return i;
}

template &lt;class t&gt;
void Space&lt;t&gt;::Deallocate(int i)
{
    a[i].next=f2;
    f2=i;
}

//////////////////////////////////
template &lt;class t&gt;
class Yblist
{
public:
    Yblist() {first=-1;}
    ~Yblist();
    int Length() const;
    bool Retrieve(int k,const t &amp;x) const;
    int Locate(const t &amp;x) const;
    Yblist&lt;t&gt; &amp;Insert(int k,const t &amp;x);
    Yblist&lt;t&gt; &amp;Delete(int k);
    void Show(ostream &amp;out) const;
private:
    int first;
    Space&lt;t&gt; s;
};

template &lt;class t&gt;
Yblist&lt;t&gt;::~Yblist()
{
    int next;
    while(first!=-1)
    {
        next=s.a[first].next;
        s.Deallocate(first);
        first=next;
    }
}

template &lt;class t&gt;
int Yblist&lt;t&gt;::Length() const
{
    int len=0;
    int next=first;
    while(next!=-1)
    {
        next=s.a[next].next;
        len++;
    }
    return len;
}

template &lt;class t&gt;
bool Yblist&lt;t&gt;::Retrieve(int k,const t &amp;x) const
{
    if(k&lt;1)
        return false;
    int next=first,index=1;
    while(index&lt;k &amp;&amp; next!=-1)
    {
        next=s.a[next].next;
        index++;
    }
    if(next!=-1)
    {
        x=s.a[next].data;
        return true;
    }
    return false;
}

template &lt;class t&gt;
int Yblist&lt;t&gt;::Locate(const t &amp;x) const
{
    int next=first,index=1;
    while(next!=-1 &amp;&amp; s.a[next].data!=x)
    {
        next=s.a[next].next;
        index++;
    }
    return (next!=-1? index: 0);
}

template &lt;class t&gt;
Yblist&lt;t&gt; &amp;Yblist&lt;t&gt;::Insert(int k,const t &amp;x)
{
    if(k&lt;0)
        throw OutOfBounds();
    int p=first;
    for(int index=1;index&lt;k &amp;&amp; p!=-1;index++)
        p=s.a[p].next;
    if(k&gt;0 &amp;&amp; p==-1)
        OutOfBounds();
    int y=s.Allocate();
    s.a[y].data=x;
    if(k)
    {
        s.a[y].next=s.a[p].next;
        s.a[p].next=y;
    }
    else
    {
        s.a[y].next=first;
        first=y;
    }
    return *this;
}

template &lt;class t&gt;
Yblist&lt;t&gt; &amp;Yblist&lt;t&gt;::Delete(int k)
{
    if(k&lt;1 || first==-1)
        throw OutOfBounds();
    int p=first;
    if(k=1)
        first=s.a[first].next;
    else
    {
        for(int index=1;index&lt;k-1 &amp;&amp; p!=-1; index++)
            p=s.a[p].next;
        if(p==-1 &amp;&amp; s.a[p].next==-1)
            throw OutOfBounds();
        int i=s.a[p].next;
        s.a[p].next=s.a[i].next;
    }
    s.Deallocate(i);
    return *this;
}

template &lt;class t&gt;
void Yblist&lt;t&gt;::Show(ostream &amp;out) const
{
    for(int p=first;p!=-1;p=s.a[p].next)
        out&lt;&lt;s.a[p].data&lt;&lt;' ';
    out&lt;&lt;endl;
}

int main()
{
    // your code
    system("pause");
    return 0;
}

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-10-08 10:40
dqzwswswws
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2005-10-7
收藏
得分:0 
Thank you very much!
But please don't explain it in english,OK?

2005-10-08 13:11
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
dqzwswswws, 要和国际接轨嘛...

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-10-08 14:12
快速回复:[求助]大家帮忙解释错误,谢谢了
数据加载中...
 
   



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

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