从我从谷歌教授那里收集到的,只需使用return。但是我的编译器告诉我必须返回一个值(我使用Visual Studio Community 17)。
基本上,我有一个执行矩阵乘法的重载*运算符。我已对该程序进行了测试,运行得很好。但是,如果用户试图传递没有定义产品的矩阵,我想添加一些条件。
/*
overloaded * operator allows proper matrix multiplication
*/
Matrix Matrix::operator*(const Matrix &right)
{
if (cols== right.rows)
{
Matrix temp(rows, right.cols);
for (int i = 0; i < rows; ++i)
for (int j = 0; j < right.cols; ++j)
for (int k = 0; k < cols; ++k)
temp.matrix[i][j] += matrix[i][k] * right.matrix[k][j];
return temp;
}
else
{
cout << "You can only multiply matrices if the number of columns of matrix A is equal to the number of rows of matrix B\n"
<< "Try changing the attributes of your matrix\n";
return;
}
}
答案 0 :(得分:1)
您的函数目前正在关注:它正常执行自包含数据操作,但在错误情况下它直接写入cout
- 这不是您应该如何设计软件。
在惯用的C ++中,您的程序应该throw
一个std::exception
对象或子类。对于这种特殊情况,我建议std::runtime_error
:
您的代码应如下所示:
using namespace std;
...
Matrix Matrix::operator*(const Matrix &right)
{
if( this->rows != right.cols ) {
throw runtime_error("Invalid 'right' argument.");
}
// continue as normal
}
然后应该使用try/catch
块包裹调用:
Matrix newMatrix;
try {
newMatrix = leftMatrix * rightMatrix;
}
catch(runtime_error& e) {
cout << e.what() << endl;
}
观察该函数不再关注 错误的显示方式 - 代码的使用者现在可以通过cout
或其他方式自由显示错误消息,例如作为Web应用程序,错误日志文件,GUI消息框等。
答案 1 :(得分:1)
所以你有:
Matrix a,b;
Matrix c=a*b;
由于维度不匹配导致c=a*b
没有意义,您希望程序的状态在a*b
行之后是什么样的?
有一些不错的答案。
其中一个是打印错误并结束程序。
其中一个是抛出异常。
其中一个是用它们的大小来扩充矩阵的类型,并且只有在尺寸匹配时才使c=a*b
编译。
其中一个是记录错误并返回某种“null”矩阵,或者包含错误的矩阵。
其中一个是让*
返回一个Maybe类型(如std::optional
或std::experimental::expected
),然后强制调用者决定如何处理失败(这只是以上,但有一个单独的模板来处理可空/错误monad而不是将其烘焙到Matrix本身。)
其中一个是调用全局或本地安装的错误回调,它决定使用上述哪一个。
在C ++中,您必须决定如何处理错误。该语言不适合您。但这个决定很重要,而且没有一个正确的答案。
答案 2 :(得分:0)
如果编译器告诉您返回值,请尝试在第二个return语句中使用return 0以及设置全局标志。这样你可以检查矩阵是否有效而不会产生错误的答案。
答案 3 :(得分:0)
编译器会要求您在函数中返回一个值,因为运算符必须返回一个值。
在else
部分,如果您需要管理异常,如果您没有在proramming中到达那里,那么只返回一个情感矩阵(您的函数的返回类型)