免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1770 | 回复: 4
打印 上一主题 下一主题

[C++] 关于C++中友元的使用问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-04 15:39 |只看该作者 |倒序浏览
这个是Essencial C++上的例子,其中“Triangular.h” 和 "Triangular_iterator.h"互相调用了,所以使用了友元,但是按照书中这样使用,便已出现错误,Triangular_iterator.h中还是找不到所调用的Triangular中的member,初学C++,求各位大神指教,多谢!!!


这个是头文件“Triangular.h”

#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include "Triangular_iterator.h"
using namespace std;

class Triangular
{
public:
        friend class Triangular_iterator;
        typedef Triangular_iterator iterator;
        Triangular_iterator begin() const
        {
                return Triangular_iterator(_beg_pos);
        }
        Triangular_iterator end() const
        {
                return Triangular_iterator(_beg_pos+_length);
        }

        Triangular();
        Triangular(int len);
        Triangular(int len, int beg_pos);
        int length() const {return _length;}
        int beg_pos() const {return _beg_pos;}
        bool next(int &val) const;
        void next_reset() const {_next = _beg_pos - 1;}
        int size_of_elem() const {return _elems.size();}
        int max_elem() const {return _max_elems;}
        static void gen_elements(int val);
        static void gen_elems_to_value(int val);
        static bool is_elem(int val);
private:
        int _length;
        int _beg_pos;
        mutable int _next;
        static const int _max_elems = 1024;        
        static vector<int> _elems;
};

vector<int> Triangular::_elems;

void Triangular::gen_elems_to_value(int val)
{
        int ix = _elems.size();
        if( !ix )
        {
                _elems.push_back(1);
                ix = 1;
        }
        while(_elems[ix-1]<val && ix<_max_elems)
        {
                ++ix;
                _elems.push_back(ix*(ix+1)/2);
        }
        if(ix==_max_elems)
        {
                cerr << "Triangular sequence: oops: value too large "
                         << val << " -- exceed max size of "
                         << _max_elems << endl;
        }
}

bool Triangular::is_elem(int val)
{
        if( !_elems.size() || _elems[_elems.size()-1]<val)
        {
                gen_elems_to_value(val);
        }
        
        vector<int>::iterator found_it;
        vector<int>::iterator end_it = _elems.end();
        
        found_it = find(_elems.begin(), end_it, val);
        return found_it != end_it;
}

void Triangular::gen_elements(int val)
{
        if(val > _max_elems)
        {
                cout << "Wrong size!" << endl;
                exit(0);
        }
        if(_elems.size() < val)
        {
                int ix = _elems.size() ? _elems.size()+1 : 1;
                for( ; ix<=val; ++ix)
                {
                        _elems.push_back(ix*(ix+1)/2);
                }        
        }
}

Triangular::Triangular()
        : _length(1),
          _beg_pos(1)
{
        _next = _beg_pos - 1;
        _elems.push_back(1);
}

Triangular::Triangular(int len)
        : _length(len > 0 ? len : 1),
          _beg_pos(1)
{
        _next = _beg_pos - 1;
        int elem_cnt = _length + _beg_pos - 1;
        
        if(_elems.size() < elem_cnt)
        {
                gen_elements(elem_cnt);
        }

}

Triangular::Triangular(int len, int beg_pos)
        : _length(len > 0 ? len : 1),
          _beg_pos(beg_pos > 0 ? beg_pos : 1)
{
        _next = _beg_pos - 1;
        int elem_cnt = _length + beg_pos - 1;
        
        if(_elems.size() < elem_cnt)
        {
                gen_elements(elem_cnt);
        }
}

bool Triangular::next(int &val) const
{
        if(_next < _beg_pos + _length - 1)
        {
                val = _elems[_next++];
                return true;
        }
        return false;
}

这个是头文件 "Triangular_iterator.h"

#include <iostream>
using namespace std;

class Triangular;
class Triangular_iterator
{
public:
        Triangular_iterator(int index);
        bool operator==(const Triangular_iterator&) const;
        bool operator!=(const Triangular_iterator&) const;
    int operator*() const;
        Triangular_iterator& operator++();
        Triangular_iterator operator++(int);
private:
        void check_integrity() const;
        int _index;
};

Triangular_iterator::Triangular_iterator(int index)
        : _index(index-1){}

inline bool Triangular_iterator::
operator==(const Triangular_iterator &rhs) const
{
        return _index==rhs._index;
}

inline bool Triangular_iterator::
operator!=(const Triangular_iterator &rhs) const
{
        return !(*this == rhs);
}

inline void Triangular_iterator::
check_integrity() const
{
        if(_index >= Triangular::_max_elems)
        {
                throw iterator_overflow();
        }
        
        if(_index >= Triangular::_elems.size())
        {
                Triangular::gen_elements(_index+1);
        }
}

inline int Triangular_iterator::
operator*() const
{
        check_integrity();
        return Triangular::_elems[_index];
}

inline Triangular_iterator& Triangular_iterator::
operator++()
{
        ++_index;
        check_integrity();
        return *this;
}

inline Triangular_iterator Triangular_iterator::
operator++(int)
{
        Triangular_iterator temp = *this;
        ++_index;
        check_integrity();
        return temp;
}

这个是主程序 :

#include <iostream>
#include "Triangular.h"
using namespace std;

int main()
{
        Triangular trian(20,12);
        Triangular::iterator it = trian.begin();
        Triangular::iterator end_it = trian.end();
        
        while(it != end_it)
        {
                cout << *it << " ";
                ++it;
        }
        return 0;
}

论坛徽章:
0
2 [报告]
发表于 2015-01-04 15:45 |只看该作者
贴上去显得代码略长,主要是怕自己表述不清出,Triangular_iterator中的两个member function :  check_integrity()和operator*()用到了 Triangular中的member
Triangular.h中包含了Triangular_iterator.h,所以没出错,但是Triangular_iterator.h就编译不通,还请大神们指点,万分感激~~~~~~~

论坛徽章:
0
3 [报告]
发表于 2015-01-04 19:19 |只看该作者
这个问题已经纠结了很久了,网上搜了好多试了都不行,才特地过来发帖子求助,各位大神帮帮忙啊,都快逼出强迫症了啊

论坛徽章:
0
4 [报告]
发表于 2015-01-05 08:08 |只看该作者
难道是因为问题看起来太长了,大神们都懒得看了?这该如何是好啊

论坛徽章:
0
5 [报告]
发表于 2015-01-05 09:47 |只看该作者
Triangular_iterator中应该使用Triangular的指针,而不是Triangular类型的静态成员
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP