我有一个迭代器类。我们在这里称它为PIterator
。迭代正在输出MessageBuffer
,除非迭代器当前指向的nSizeOfMessage
加上等于整个消息的大小(位置正确,索引太大)。
如果我检查最后一个元素并减1,它应该可以工作。虽然这对我来说似乎是一种“错误的方式”。是的,我对此不太确定,所以我的问题显示在这个代码片段中,也许有人知道一个很好的解决方案,试图找出它已经有一段时间了。
是的,我确实知道如何使用调试器,我知道问题出在哪里,并且解释得很好。我不知道如何解决这个问题,除非按照我提到的方式使用。
这在Visual Studio 2015下编译得很好。
另请参阅主要功能中的注释。
#include <iostream>
#include <vector>
class MessageBuffer
{
public:
MessageBuffer(const std::string &s)
{
_msgBuffer.assign(s.begin(), s.end());
}
char &operator[](std::size_t nIndex)
{
return _msgBuffer[nIndex];
}
//more functions...
private:
std::vector<char> _msgBuffer;
};
class PIterator
{
public:
PIterator(MessageBuffer &b)
: m_Ref(b)
, m_Where(0)
{ }
PIterator &operator=(PIterator &other)
{
if (this == &other)
return *this;
this->m_Ref = other.m_Ref;
this->m_Where = other.m_Where;
return *this;
}
//more functions...
PIterator operator+(unsigned int nValue) const
{
PIterator copy(*this);
copy.m_Where += nValue;
return copy;
}
PIterator &operator+=(unsigned int nValue)
{
m_Where += nValue;
return *this;
}
char &operator*()
{
return m_Ref[m_Where];
}
private:
MessageBuffer &m_Ref;
std::size_t m_Where;
};
int wmain(int argv, wchar_t **args)
{
std::string msg = "123MyMessage"; //Length 12
// ^ Index 3, Position 4
MessageBuffer mb(msg);
PIterator itr(mb);
//Calculations - here the results hardcoded
std::size_t nSizeOfMessage = 9; //The size of the message without the numbers
//itr.m_Where is 3 - That's where the non-numeric part of the message starts
itr += 3;
std::string needThis;
PIterator cpy = itr + nSizeOfMessage; //itr points to the first element of the message
//cpy is now out of bounds - position is correct, but index is 1 too large
needThis.assign(&*itr, &*cpy); //boom
return 0;
}
答案 0 :(得分:0)
而不是
needThis.assign(&*itr, &*cpy);
你需要使用
needThis.assign(itr, cpy);
如果您的 PIterator 满足迭代器要求,这将有效。
你调用赋值的方式,你传递指针而不是迭代器,它本身是有效的。但是,要获得指针,首先取消引用迭代器。取消引用过去的迭代器是未定义的行为,它在编译器的Debug配置中被捕获。
答案 1 :(得分:0)
我提出的解决方案非常简单 我没有使用临时迭代器,而是使用char指针并根据消息的大小递增它的地址,从而始终接收正确的最后一个元素。 应该早点见过。
needThis.assign(&*itr, (&*itr) + nSizeOfMessage);