C++ 重载运算符>>(输入)不会更改原始运算符
C++ Overloading operator >> (input) doesn't change original
我正在尝试使用自定义字符串和定义类构建一个自定义字典类。在尝试重载>>(输入)时,我遇到了某种问题。当函数结束时,发送到它的字典不会改变。附加代码:这是重载:
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];
所以我改变了它,所以它不会访问它,而是先构建它。
谢谢亚历山大的帮助!
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 是否需要使用 - &gt;运算符在C 中调用成员函数时