使类可迭代:访问冲突读取位置

阿巴努布·埃米尔

我创建了一个名为ring的类,它的工作原理如下:

ring<std::string> example(2);
examples.add("one");
examples.add("two");
examples.add("three"); // this element will replace the first element

另外,我尝试使其变得可迭代,但由于异常访问冲突读取位置而崩溃,该异常位置位于主for循环中的cout处,而该程序在没有for循环的情况下运行良好

铃声类:

template <class input>
class ring {
public:
    class iterator;

private:
    input* data;
    int size;
    int pos = 0;

public:
    ring(const int size) : size(size), data(NULL) { data = new input[size]; }

    ~ring() { delete[] data; }

    void add(input in) {
        if (pos == size)
            pos = 0;
        data[pos++] = in;
    }

    iterator begin() { return iterator(0, *this); }

    iterator end() { return iterator(size - 1, *this); }

    input& get(int i) { return data[i]; }
};

迭代器类:

template <class input>
class ring<input>::iterator {
private:
    int m_pos;
    ring m_ring;

public:
    iterator(int pos, ring& aRing) : m_pos(pos), m_ring(aRing) {}

    ~iterator() {}

    input& operator* () { return m_ring.get(m_pos); }

    bool operator!= (const iterator& other) const { return m_pos != other.m_pos; }

    iterator& operator++(int) {
        m_pos++;
        return *this;
    }

    iterator& operator++() {
        m_pos++;
        return *this;
    }
};

主要:

int main() {
    ring<string> textring(3);

    textring.add("one");
    textring.add("two");
    textring.add("three");
    textring.add("four");

    for (auto text : textring) {
        cout << text << endl;
    }
}
rafix07

您的程序崩溃,因为类ring未实现3的规则您应该提供所有复制操作。

撞车的原因是什么?

在析构函数中,相同的内存由于浅拷贝而被删除了两次。此副本由begin/制成,end它返回您在其中复制的迭代器ring

快速解决方案是将ring迭代器存储在内部作为参考:

template <class input>
class ring<input>::iterator {
private:
    int m_pos;
    ring& m_ring;

演示版

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章