C++11 在内部类C+中存储外部类对象时出错+;

C++11 在内部类C+中存储外部类对象时出错+;,c++11,inner-classes,circular-buffer,C++11,Inner Classes,Circular Buffer,我在实现环形缓冲区时遇到了一个错误。在内部类(类迭代器)中存储外部类(类环)对象(m_环)的引用意味着什么?当我删除引用(&)时,程序会正确编译但崩溃。请解释发生了什么。(参见Ring.h中的评论)对不起,英语不好 // Ring.h #ifndef RING.H #define RING.H #include <iostream> using namespace std; template<class T> class ring { unsigned int

我在实现环形缓冲区时遇到了一个错误。在内部类(类迭代器)中存储外部类(类环)对象(m_环)的引用意味着什么?当我删除引用(&)时,程序会正确编译但崩溃。请解释发生了什么。(参见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.h
#ifndef环
#定义环.H
#包括
使用名称空间std;
模板
阶级戒指{
无符号整数m_大小;
国际货币基金组织;
T*m_值;
公众:
类迭代器;
公众:
环(无符号整数大小):m_大小(大小),m_位置(0)
{
m_值=新的T[m_大小];
}
~ring()
{
删除[]个m_值;
}
无效添加(常量T&val)
{
m_值[m_pos]=val;
m_pos++;
m_pos%=m_尺寸;
}
T&get(内部位置)
{
返回m_值[pos];
}
迭代器begin()
{
返回迭代器(0,*this);
}
迭代器结束()
{
返回迭代器(m_size,*this);
}
};
模板
类环::迭代器{
国际货币基金组织;
ring&m_ring;//删除并给出垃圾输出。
公众:
迭代器(int-pos,ring&aRing):m_-pos(pos),m_-ring(aRing){}
布尔运算符!=(常量迭代器和其他)常量
{
返回other.m_pos!=m_pos;
}
迭代器和运算符++(int)
{
m_pos++;
归还*这个;
}
迭代器和运算符++()
{
m_pos++;
归还*这个;
}
T&运算符*()
{
//返回m_ring.m_值[m_pos];
返回m_环。获取(m_位置);
}
};
#endif//环
驱动程序:

// 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\u Buffer\u Class.cpp
#包括
#包括“ring.h”
使用名称空间std;
int main()
{
手机铃声(3);
textring.add(“一”);
textring.add(“两个”);
textring.add(“三”);
textring.add(“四”);
//C++ 98
for(ring::iterator it=textring.begin();it!=textring.end();it++)
{

你能为我添加一个缺少的
#include
,以及你的程序吗?又是什么问题?@igortandtnik你能解释一下为什么添加这个头时它运行正确吗?@igortandtnik你在使用gcc(vc++)编译器,我不知道为什么它运行得很好,但我在我的电脑中使用了g++11编译器,它输出垃圾值。第一条注释中的链接是针对MSVC的。但是,为了完整性,也为了完整性。你说你“遇到了错误”。确切的错误是什么?显示完整的错误消息。