第二个迭代器覆盖第一个迭代器
Second iterator overwrites first iterator
我(还)不是一个优秀的 C++ 编码员,我正在完成一本培训书中的一些任务,我在其中为 IP 地址写了 class。在这个 class 中,我有一个私有的 vector<string>
来保存地址的单个块。
我重载了 == operator
,在这里我交出了我想通过引用进行比较的对象。
我有 vector::iterator
this-object
。我现在遇到的问题是我为 compareTo-object
定义的第二个迭代器覆盖了第一个迭代器。
我已经找了几个小时的错误。请找到代码片段及其输出附件。有任何想法吗?或者这是 C++ 的预期行为?我在 MacOS 上使用 CLANG 编译器。
来自 Class IPv4
class IPv4
{
private:
string adress;
vector<string> IPBlocksOfAdress;
bool testIP();
vector<string> splitString(const string stringToSplit, char delimiter = '.');
public:
IPv4::IPv4(const string &inputAdress)
{
setAdress(inputAdress);
}
bool IPv4::testIP()
{
bool isIP = true;
for (vector<string>::iterator blocksOfAdressIterator = IPBlocksOfAdress.begin();
blocksOfAdressIterator != IPBlocksOfAdress.end(); blocksOfAdressIterator++) {
if (stoi(*blocksOfAdressIterator) > 255 || stoi(*blocksOfAdressIterator) < 0) {
isIP = false;
}
}
return isIP;
}
vector<string> IPv4::splitString(const string stringToSplit, char delimiter)
{
vector<string> blocksOfAdress;
stringstream stringToSplitStream(stringToSplit);
string blockOfAdress = "";
while (getline(stringToSplitStream, blockOfAdress, delimiter)) {
blocksOfAdress.push_back(blockOfAdress);
}
return blocksOfAdress;
}
string IPv4::getAdress() const
{
if (adress != "0.0.0.0") {
return adress;
} else {
return "Error, Adress not set.";
}
}
vector<string> IPv4::getAdressBlocks() const
{
return IPBlocksOfAdress;
}
void IPv4::setAdress(const string &inputAdress)
{
IPBlocksOfAdress = splitString(inputAdress,'.');
if (testIP()) {
cout << "Neue IP Addresse: " << inputAdress << endl;
adress = inputAdress;
} else {
cout << "Die Eingabe entspricht nicht dem IPv4-Format. Setze Adresse auf 0.0.0.0" << endl;
adress = "0.0.0.0";
IPBlocksOfAdress = splitString(adress,'.');
}
}
bool IPv4::operator == (const IPv4 &compareTo) const
{
cout << " ... in operator == ..." << endl;
bool isIdenticalThis = true;
cout << "this Adress: " << this->getAdress() << endl;
cout << "compareTo Adress: " << compareTo.getAdress() << endl;
vector<string>::iterator adressBlockThis = this->getAdressBlocks().begin();
cout << "this first block: " << *adressBlockThis << endl;
vector<string>::iterator adressBlockCompareTo = compareTo.getAdressBlocks().begin();
cout << "compareTo first block: " << *adressBlockCompareTo << endl;
cout << "this first block second printout: " << *adressBlockThis << endl;
...
}
来自主要:
IPv4 myIP("1.2.3.4");
cout << "Get IP: " << myIP.getAdress() << endl;
IPv4 mySecondIP("5.6.7.8");
cout << "Get IP: " << mySecondIP.getAdress() << endl;
cout << myIP.getAdress() << " == " << mySecondIP.getAdress()
<< " = " << (myIP == mySecondIP) << endl;
输出控制台:
Neue IP Addresse: 1.2.3.4
Get IP: 1.2.3.4
Neue IP Addresse: 5.6.7.8
Get IP: 5.6.7.8
1.2.3.4 == 5.6.7.8 =
... in operator == ...
this Adress: 1.2.3.4
compareTo Adress: 5.6.7.8
this first block: 1
compareTo first block: 5
this first block second printout: 5 <------- this should be 1
1
您的迭代器未 "overwritten",它正在失效。它是悬空的。两个都是。
您看到的数字纯属偶然。 (好吧,它们不是;我们可以推断出为什么你在某种程度上看到它们,在这种情况下,它们的来源非常明显,但未定义的行为就是未定义的行为,最好就这样吧。 )
getAdressBlocks
应该 return 对现有矢量的 引用 。 value/copy 正在 returning 现在几乎立即消失,留下一个指向不再存在的东西的第一个元素的迭代器。
您通过 const IPv4&
调用此函数,因此它必须(并且应该)return 一个 const
引用:
const vector<string>& IPv4::getAdressBlocks() const
{
return IPBlocksOfAdress;
}
这也意味着您的迭代器必须是 vector<string>::const_iterator
.
而且你一直拼错 "address"。
我(还)不是一个优秀的 C++ 编码员,我正在完成一本培训书中的一些任务,我在其中为 IP 地址写了 class。在这个 class 中,我有一个私有的 vector<string>
来保存地址的单个块。
我重载了 == operator
,在这里我交出了我想通过引用进行比较的对象。
我有 vector::iterator
this-object
。我现在遇到的问题是我为 compareTo-object
定义的第二个迭代器覆盖了第一个迭代器。
我已经找了几个小时的错误。请找到代码片段及其输出附件。有任何想法吗?或者这是 C++ 的预期行为?我在 MacOS 上使用 CLANG 编译器。
来自 Class IPv4
class IPv4
{
private:
string adress;
vector<string> IPBlocksOfAdress;
bool testIP();
vector<string> splitString(const string stringToSplit, char delimiter = '.');
public:
IPv4::IPv4(const string &inputAdress)
{
setAdress(inputAdress);
}
bool IPv4::testIP()
{
bool isIP = true;
for (vector<string>::iterator blocksOfAdressIterator = IPBlocksOfAdress.begin();
blocksOfAdressIterator != IPBlocksOfAdress.end(); blocksOfAdressIterator++) {
if (stoi(*blocksOfAdressIterator) > 255 || stoi(*blocksOfAdressIterator) < 0) {
isIP = false;
}
}
return isIP;
}
vector<string> IPv4::splitString(const string stringToSplit, char delimiter)
{
vector<string> blocksOfAdress;
stringstream stringToSplitStream(stringToSplit);
string blockOfAdress = "";
while (getline(stringToSplitStream, blockOfAdress, delimiter)) {
blocksOfAdress.push_back(blockOfAdress);
}
return blocksOfAdress;
}
string IPv4::getAdress() const
{
if (adress != "0.0.0.0") {
return adress;
} else {
return "Error, Adress not set.";
}
}
vector<string> IPv4::getAdressBlocks() const
{
return IPBlocksOfAdress;
}
void IPv4::setAdress(const string &inputAdress)
{
IPBlocksOfAdress = splitString(inputAdress,'.');
if (testIP()) {
cout << "Neue IP Addresse: " << inputAdress << endl;
adress = inputAdress;
} else {
cout << "Die Eingabe entspricht nicht dem IPv4-Format. Setze Adresse auf 0.0.0.0" << endl;
adress = "0.0.0.0";
IPBlocksOfAdress = splitString(adress,'.');
}
}
bool IPv4::operator == (const IPv4 &compareTo) const
{
cout << " ... in operator == ..." << endl;
bool isIdenticalThis = true;
cout << "this Adress: " << this->getAdress() << endl;
cout << "compareTo Adress: " << compareTo.getAdress() << endl;
vector<string>::iterator adressBlockThis = this->getAdressBlocks().begin();
cout << "this first block: " << *adressBlockThis << endl;
vector<string>::iterator adressBlockCompareTo = compareTo.getAdressBlocks().begin();
cout << "compareTo first block: " << *adressBlockCompareTo << endl;
cout << "this first block second printout: " << *adressBlockThis << endl;
...
}
来自主要:
IPv4 myIP("1.2.3.4");
cout << "Get IP: " << myIP.getAdress() << endl;
IPv4 mySecondIP("5.6.7.8");
cout << "Get IP: " << mySecondIP.getAdress() << endl;
cout << myIP.getAdress() << " == " << mySecondIP.getAdress()
<< " = " << (myIP == mySecondIP) << endl;
输出控制台:
Neue IP Addresse: 1.2.3.4
Get IP: 1.2.3.4
Neue IP Addresse: 5.6.7.8
Get IP: 5.6.7.8
1.2.3.4 == 5.6.7.8 =
... in operator == ...
this Adress: 1.2.3.4
compareTo Adress: 5.6.7.8
this first block: 1
compareTo first block: 5
this first block second printout: 5 <------- this should be 1
1
您的迭代器未 "overwritten",它正在失效。它是悬空的。两个都是。
您看到的数字纯属偶然。 (好吧,它们不是;我们可以推断出为什么你在某种程度上看到它们,在这种情况下,它们的来源非常明显,但未定义的行为就是未定义的行为,最好就这样吧。 )
getAdressBlocks
应该 return 对现有矢量的 引用 。 value/copy 正在 returning 现在几乎立即消失,留下一个指向不再存在的东西的第一个元素的迭代器。
您通过 const IPv4&
调用此函数,因此它必须(并且应该)return 一个 const
引用:
const vector<string>& IPv4::getAdressBlocks() const
{
return IPBlocksOfAdress;
}
这也意味着您的迭代器必须是 vector<string>::const_iterator
.
而且你一直拼错 "address"。