C=A+B会报错显示二元“=”: 没有找到接受“Matrix”类型的右操作数的运算符(或没有可接受的转换)应该如何修改
时间: 2023-09-30 20:11:28 浏览: 59
要使 C = A + B 这个语句正确执行,需要在 Matrix 类中定义一个接受 Matrix 类型的右操作数的赋值运算符,如下所示:
```
Matrix& operator=(const Matrix& b) {
if (this != &b) {
rows = b.rows;
cols = b.cols;
if (p) {
delete[] p;
}
p = new int[rows * cols];
for (int i = 0; i < rows * cols; i++) {
p[i] = b.p[i];
}
}
return *this;
}
```
这个赋值运算符会将右操作数的矩阵元素复制到当前对象中,并返回当前对象的引用。
在执行 C = A + B 的时候,编译器会先计算 A + B 的结果,得到一个临时的矩阵对象,然后再将这个临时对象的内容复制给 C。这个过程中,需要调用 Matrix 类型的赋值运算符,才能将临时对象的内容正确地赋值给 C。
注意,为了避免自我赋值的情况,赋值运算符中加入了 self-assignment 判定条件,如果左右操作数是同一个对象,则不进行赋值操作,直接返回当前对象的引用。
相关问题
Matrix operator=(Matrix& b) { rows = b.rows; cols = b.cols; p = new int[rows * cols]; for (int i = 0; i < rows * cols; i++) { p[i] = b.p[i]; } return *this; } C = A + B; 这段代码编译时会报错,显示二元“ = ”: 没有找到接受“Matrix”类型的右操作数的运算符(或没有可接受的转换)这是为什么,如何修改
这是因为在执行 C = A + B; 的时候,编译器不知道如何将 A + B 的结果赋值给 C,因为没有为 Matrix 类型定义相应的赋值运算符。
要修复这个问题,需要在 Matrix 类中定义一个接受 Matrix 类型的右操作数的赋值运算符(operator=),例如:
```
Matrix& operator=(const Matrix& b) {
if (this != &b) {
rows = b.rows;
cols = b.cols;
if (p) {
delete[] p;
}
p = new int[rows * cols];
for (int i = 0; i < rows * cols; i++) {
p[i] = b.p[i];
}
}
return *this;
}
```
这个赋值运算符会将右操作数的矩阵元素复制到当前对象中,并返回当前对象的引用。这样就可以正确地执行 C = A + B; 了。
error C2679: 二元“<<”: 没有找到接受“const KFC”类型的右操作数的运算符(或没有可接受的转换)
这个错误是因为在使用 << 运算符时,右操作数的类型不能被正确地转换。在这个错误中,右操作数的类型是 KFC,但是可能没有定义与其类型相匹配的 << 运算符。
要解决这个错误,你需要确保右操作数的类型能够被正确地转换。你可以在 KFC 类中定义一个友元函数 << 运算符,或者在 KFC 类中重载 << 运算符,以便能够正确地输出 KFC 对象。
例如,你可以在 KFC 类中添加以下代码来重载 << 运算符:
```
class KFC {
public:
// KFC 类的成员和函数
friend std::ostream& operator<<(std::ostream& os, const KFC& kfc) {
os << "KFC " << kfc.type << " " << kfc.size << " " << kfc.price;
return os;
}
};
```
这个重载的 << 运算符将 KFC 对象的信息输出到 ostream 流中,然后返回该流。现在你就可以使用 << 运算符来输出 KFC 对象了:
```
KFC myKFC("Original Recipe", "Large", 12.99);
std::cout << myKFC << std::endl;
```
输出结果应该是:
```
KFC Original Recipe Large 12.99
```