【发布时间】:2020-08-01 06:13:26
【问题描述】:
抛出异常,访问冲突读取位置。 我已经完美地重载了所有运算符,并且不知道发生这种情况的原因。 该循环在本教程中运行良好,但它没有在我的系统上运行。 请帮帮我,这是代码-
这是我定义的 - ring.h
#pragma once
#ifndef RING_H_
#define RING_H_
#include<iostream>
using namespace std;
template<class T>
class ring
{
private:
int m_pos;
T* m_values;
int m_size;
public:
class iterator;
public:
ring(int size) : m_pos(0), m_size(size), m_values(NULL)
{
m_values = new T[size];
}
~ring()
{
delete[] m_values;
}
int size()
{
return m_size;
}
iterator begin()
{
return iterator(0, *this);
}
iterator end()
{
return iterator(m_size-1, *this);
}
void add(T value)
{
m_values[m_pos++] = value;
if (m_pos == m_size)
{
m_pos = 0;
}
}
T& get(int pos)
{
return m_values[pos];
}
};
template<class T>
class ring<T>::iterator
{
private:
int m_pos;
ring m_ring;
public:
iterator(int pos, ring &aRing): m_ring(aRing), m_pos(pos) {}
iterator& operator++(int)
{
m_pos++;
return *this;
}
T& operator*()
{
return m_ring.get(m_pos);
}
bool operator!=(const iterator& other) const
{
return m_pos != other.m_pos;
}
};
#endif //RING_H_
这是包含主要功能的文件 - (source.cpp)
#include<iostream>
#include"ring.h"
using namespace std;
int main()
{
ring<string> textring(3);
textring.add("One");
textring.add("Two");
textring.add("Three");
for (ring<string>::iterator it = textring.begin(); it != textring.end(); it++)
{
cout << *it << endl;
}
cout << endl;
/*for (string value : textring)
{
cout << value << endl;
}*/
}
【问题讨论】:
-
正如@Someprogrmmerdude 给出的答案所指出的那样,您不需要所有代码来显示您的课程存在严重缺陷。
int main() { ring<string> testString(3); ring<string> s2 = testString; ring<string> s3(2) ; s3 = s2;}。那个简单的程序有内存泄漏和双重删除错误。你不能为这样一个从根本上被破坏的类实现迭代器,至少有信心。 -
@PaulMcKenzie 我刚刚从我的教程人那里复制了它,它与导师工作得很好,但非常感谢您指出,谢谢人
标签: c++ visual-studio exception operator-overloading