第二个迭代器会覆盖第一个迭代器

时间:2018-11-23 21:23:06

标签: c++ iterator operator-overloading stdvector overwrite

我还不是C ++的优秀编码员,我正在完成一本培训书中的某些任务,在该书中,我编写了IP地址类。在此类中,我有一个专用的vector<string>,它保存地址的单个块。 我使== operator重载了,在这里我移交了我想通过引用进行比较的对象。

我有一个vector::iterator的{​​{1}}。我现在遇到的问题是,我为this-object定义的第二个迭代器会覆盖第一个迭代器。

我已经找了好几个小时了。请找到该代码段及其输出。有任何想法吗?还是C ++的这种预期行为?我在MacOS上使用CLANG-compiler。

来自IPv4类

compareTo-object

来自主站:

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;

1 个答案:

答案 0 :(得分:0)

您的迭代器没有被“覆盖”,而是被无效了。晃来晃去。他们都是。

您看到的数字纯属偶然。 (好吧,它们不是;我们可以推断出您为什么会在某种程度上看到它们,在这种情况下,它们的来源很明显,但是未定义的行为是未定义的行为,最好只保留它。 )

getAdressBlocks应该向现有向量返回引用。现在,它返回的值/副本几乎立即死亡,给您一个指向不再存在的元素的第一个元素的迭代器。

您正在通过const IPv4&调用此函数,因此它必须(并且应该)返回const引用:

const vector<string>& IPv4::getAdressBlocks() const
{
    return IPBlocksOfAdress;
}

这也意味着尽管您的迭代器必须为vector<string>::const_iterator

您在整个地方都遗漏了“地址”。