for 문에 사용할 클래스 및 클래스에 대한 반복기 템플릿이 있습니다.대체 클래스에서 포인터를 사용하는 이유 기본 클래스에서 연산자 == 및 연산자! =
template<class T>
class Itr2 {
public:
Itr2() { }
~Itr2() { }
typedef typename Itr2 type;
typedef typename T& reference;
virtual type& operator++() { return *this; }
virtual T& operator*() { return ((reference)*((type*)this)); }
virtual bool operator==(const type& o) const { return true; }
virtual bool operator!=(const type& o) const { return false; }
};
template<class T>
class I2
{
public:
typedef I2<T> type;
typedef T value;
typedef T& reference;
typedef typename Itr2<T> iterator;
virtual iterator& begin() { return *(new iterator()); }
virtual iterator& end() { return *(new iterator()); }
};
다음으로 표준 표준 : 벡터 <>에 대한 클래스를 생성했습니다.
template<class T>
class ItrSTD : public Itr2<T> {
public:
typedef typename Itr2<T> base_type;
typedef typename ItrSTD<T> type;
typedef typename T& reference;
typedef typename std::vector<T>::iterator std_itr;
protected:
std_itr itr_;
public:
ItrSTD(const type& o) { itr_ = o.itr_; }
ItrSTD(const std_itr& o) { itr_ = o; }
virtual base_type& operator++() { itr_++; return *this; }
virtual T& operator*() { return ((reference)(*this->itr_)); }
bool operator==(const base_type& o) const override { return (((const type&)o).itr_ == this->itr_); }
bool operator!=(const base_type& o) const override { return (((const type&)o).itr_ != this->itr_); }
};
template<class T>
class VSTD : public I2<T> {
protected:
std::vector<T> arr_;
public:
typedef typename ItrSTD<T> iterator;
VSTD(const VSTD& o) { arr_ = o.arr_; }
template<typename ...E> VSTD(E&&...e) : arr_({ std::forward<T>(e)... }) { }
iterator& begin() _NOEXCEPT override{ return (*new iterator(arr_.begin())); }
iterator& end() _NOEXCEPT override{ return (*new iterator(arr_.end())); }
};
(int i : v)의 직접 구문을 사용하는 경우. 그것은 :(잘 작동하지만 내가 포인터 컴파일러 사용의 기본 클래스 연산자에서이 작업을 수행 할 때! = (연산자를 오버라이드 (override)하지! =) 및 코드가 작동하지 않습니다됩니다.
int v_i = 0;
VSTD<int> vstd_a = { 1, 2, 3 };
I2<int> *i2 = &vstd_a;
for (int j : *i2) //DOESN't work :(use operator!= from base class
{
v_i += j;
}
for (int j : vstd_a) //work fine :) use operator!= from VSTD.
{
v_i += j;
}
내가 코드를 단순화 경우 :() 나쁜 일 : : :
template<typename T>
class I3
{
public:
T i;
virtual bool operator==(const I3& o) const { return false; }
};
template<typename T>
class I3O : public I3<T>
{
public:
virtual bool operator==(const I3& o) const override { return true; }
};
I3O<int> i3_a, i3_b; I3<int> *i3_ap, *i3_bp;
i3_ap = &i3_a; i3_bp = &i3_b; bool i3_c;
i3_c = (i3_a == i3_b);
i3_c = ((*i3_ap) == (*i3_bp));
두 결과
이 (true를 반환) 괜찮 만 (위해 (재정의 클래스에서 비교. 이왜 이런 일이 템플릿 포인터 문에 사용할 수 있습니다 ? begin(), end() 함수는 잘 작동하며 연산자 만 다르게 작동합니다.
P. VS2013 컴파일러를 사용합니다.
참조를 반환하는 함수에서'* new ... '를 실제로 반환하지 않습니다. 그렇습니까? 그것은 거의 보장 된 메모리 누수입니다. –
클래스'Itr2'의 소멸자는 아마'가상', 아마도 순수한'가상'이어야합니다. –