Я никогда раньше не работал с итераторами, и у меня возникли проблемы с созданием пользовательского итератора для пользовательского класса контейнеров, который я написал.C++ Iterators return type
фона: Использование Google Тесты API, эти два случая испытаний, которые у меня есть:
TEST(RandomArray, End) {
RandomArray r(17);
int *b = r.begin();
int *e = r.end();
EXPECT_EQ(b + 17, e);
}
TEST(RandomArray, IteratorTypedef) {
RandomArray r(7);
for (RandomArray::iterator it = r.begin(); it != r.end(); ++it) {
*it = 89;
EXPECT_EQ(89, *it);
}
}
Вот мой файл заголовка и код для итераторов:
class RandomArray
{
friend ostream& operator<<(ostream&, const RandomArray&);
public:
class iterator
{
public:
typedef iterator self_type;
typedef int* pointer;
typedef int& reference;
self_type operator++() { self_type i = *this; ptr++; return i;}
reference operator*() {return *ptr;}
bool operator!=(const self_type& rhs) {return ptr != rhs.ptr;}
private:
pointer ptr;
};
class const_iterator
{
public:
typedef const_iterator self_type;
typedef int* pointer;
typedef int& reference;
self_type operator++() { self_type i = *this; ptr++; return i;}
const reference operator*() { return *ptr; }
bool operator!=(const self_type& rhs) {return ptr != rhs.ptr;}
private:
pointer ptr;
};
RandomArray();
RandomArray(size_t);
size_t size() const;
int* begin();
iterator begin();
const int* begin() const;
const iterator begin() const;
int* end();
iterator end();
const int* end() const;
const iterator end() const;
private:
size_t capacity;
int* data;
};
Ошибка I» m Начало и конец: Error: Cannot overload functions distinguished by return type alone.
Я знаю, что вам не разрешено иметь одно и то же имя функции и одинаковые параметры с разными типами возврата, поэтому я интересно, есть ли лучший способ сделать это? Я правильно делаю итератор? Помог ли шаблон исправить это? Мне нужны begin()
и end()
, чтобы вернуть как int*
, так и iterator
, поэтому я могу сдать оба тестовых примера. Есть ли лучший способ сделать это?
Избавиться от возвращения указателя и возвращать только итераторы? – NathanOliver
И исправьте тестовые чехлы, то, что они просят, невозможно. – ubik