Ошибка при сохранении объекта внешнего класса во внутреннем классе C ++ - PullRequest
0 голосов
/ 13 июня 2018

Я реализовал кольцевой буфер и обнаружил ошибку.Что означает хранить ссылку на объект внешнего класса (class ring) (m_ring) во внутреннем классе (итератор класса), и когда я удаляю ссылку (&), программа компилируется правильно, но вылетает.Пожалуйста, объясните, что происходит. (См. Комментарий в Ring.h) Извините за плохой английский.

// Ring.h
#ifndef RING.H
#define RING.H
#include <iostream>
using namespace std;

template<class T>
class ring {
    unsigned int m_size;
    int m_pos;
    T *m_values;
public:
    class iterator;
public:
    ring(unsigned int size) : m_size(size), m_pos(0)
    {
        m_values = new T[m_size];
    }
    ~ring()
    {
        delete[] m_values;
    }
    void add(const T &val)
    {
        m_values[m_pos] = val;
        m_pos++;
        m_pos %= m_size;
    }
    T& get(int pos)
    {
        return m_values[pos];
    }
    iterator begin()
    {
        return iterator(0, *this);
    }
    iterator end()
    {
        return iterator(m_size, *this);
    }
};
template<class T>
class ring<T>::iterator {
    int m_pos;
    ring &m_ring;                              // Removing & gives garbage output.
public:
    iterator(int pos, ring& aRing) : m_pos(pos), m_ring(aRing){}
    bool operator!=(const iterator &other) const
    {
        return other.m_pos != m_pos;
    }
    iterator &operator++(int)
    {
        m_pos++;
        return *this;
    }
    iterator &operator++()
    {
        m_pos++;
        return *this;
    }
    T &operator*()
    {
       // return m_ring.m_values[m_pos];
        return m_ring.get(m_pos);
    }
};
#endif // RING

Программа драйвера:

// Ring_Buffer_Class.cpp

#include <iostream>
#include "ring.h"
using namespace std;
int main()
{
    ring<string> textring(3);
    textring.add("one");
    textring.add("two");
    textring.add("three");
    textring.add("four");
    // C++ 98
    for(ring<string>::iterator it = textring.begin(); it != textring.end(); it++)
    {
        cout << *it << endl;
    }
    cout << endl;
    // C++11
    for(string value : textring)
    {
        cout << value << endl;
    }
    return 0;
}

Я также заметил, что удаление ~ ring ()(Деструктор) приводит к правильному выводу.
Ожидаемый результат:

четыре
два
три

четыре
два
три

...