C++ 重载运算符>>(输入)不会更改原始运算符

C++ Overloading operator >> (input) doesn't change original

本文关键字:gt 运算符 原始 重载 C++ 输入      更新时间:2023-10-16

我正在尝试使用自定义字符串和定义类构建一个自定义字典类。在尝试重载>>(输入)时,我遇到了某种问题。当函数结束时,发送到它的字典不会改变。附加代码:这是重载:

istream& operator>>(istream& ip, Dictionary& var) {
    Definition temp;
    ip >> temp;
    var += temp;
    return ip;
}

以及其中使用的其他一些功能:

Dictionary& Dictionary::operator+=(Definition& input) {
    if (!checkCopy(input))
    {
        Definition** temp;
        temp = new Definition*[numWords + 1];
        for (int i = 0; i < numWords; i++)
        {
            temp[i] = book[i];
        }
        numWords++;
        temp[numWords - 1] = &input;
        delete[] book;
        book = temp;
    }
    return *this;
}
Dictionary::Dictionary(Dictionary& input) {
    *this = input;
}
Dictionary& Dictionary::operator=(Dictionary& input) {
    if (numWords != 0)
        delete[] book;
    book = new Definition*[input.numWords];
    for (int i = 0; i < input.numWords; i++)
    {
        *this += *input.book[i];
    }
    return *this;
}

以及类本身:

class Dictionary
{
private:
    int numWords = 0;
    Definition** book;
public:
    Dictionary();
    ~Dictionary();
    Dictionary(Dictionary&);
    bool operator==(Dictionary&) const;
    Dictionary& operator=(Definition&);
    Dictionary& operator=(Dictionary&);
    friend ostream& operator<<(ostream&, const Dictionary&);
    friend istream& operator>>(istream&, Dictionary&);
    Dictionary& operator-=(int);
    Dictionary& operator+=(Definition&);
    bool checkCopy(Definition&);
    Definition& operator[](int); //left side brackets for input
    Definition operator[](int) const; //right side brackets for output
};

编辑:这里也是定义输入的重载运算符:

istream& operator>>(istream& ip, Definition& var)
{
    cout << "Please enter a word: " << endl;
    ip >> var.word;
    cout << "Please enter the number of definitions for this word: " << endl;
    int idx;
    cin >> idx;
    while (idx<0)
    {
        cout << "Error: number of definitions not possible. Please Try again: " << endl;
        cin.clear();
        cin.ignore(INT_MAX, 'n');
        cin >> idx;
    }
    cin.clear();
    cin.ignore(INT_MAX, 'n');
    String* temp = new String[idx];
    for (int i = 0; i < idx; i++) {
        cout << "Please enter the " << i + 1 << "th definition: " << endl;
        cin >> temp[i];
        var += temp[i];
    }
    var.sortDefinition();
    return ip;
}

确实需要帮助。

你应该真正坚持std::vector和其他集合类型,而不是像这里那样玩弄指针和new/delete

operator+= 函数中,您将临时变量的地址复制到数组中:

temp[numWords - 1] = &input;

一旦调用函数operator>>结束,这个指针就不那么有价值了,因为原始对象(Definition temp;)不再存在。因此,该代码的行为是未定义的!

您可以通过Definition定义一个副本 c'tor 然后将上面的行更改为:

*temp[numWords - 1] = input;

此外,在您的赋值运算符中,您正在使用operator+=函数。但是,此时您的numWords成员设置不正确,因此operator+=可能会做错误的事情。因此,在赋值运算符中添加一行,如下所示:

if (numWords != 0)
{
    delete[] book;
    numWords = 0; // add this line
}

有 2 个问题:

亚历山大对临时变量的评价。 将其更改为:

Dictionary& Dictionary::operator+=(Definition& input) {
    if (!checkCopy(input))
    {
        Definition** temp;
        temp = new Definition*[numWords + 1];
        temp[0] = new Definition[numWords];
        for (int i = 0; i < numWords; i++)
        {
            temp[i] = book[i];
        }
        temp[0][numWords] = input;
        delete[] book;
        book = temp;
        numWords++;
    }
    return *this;
}

第二个是在 Definition 类中,当我尝试访问由于双指针而未创建的对象中的定义数时:

Definition** temp;
temp = new Definition*[numWords + 1];

所以我改变了它,所以它不会访问它,而是先构建它。

谢谢亚历山大的帮助!