- 论坛徽章:
- 0
|
这个是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;
} |
|