C++ 如何从成员函数返回对新对象实例的引用(在某些操作之后)?
我正在尝试创建一个矩阵类“ECE_Matrix”。它将采用常数ECE_矩阵并执行所有一般操作。这些操作不应更改传递的实例 对于转置,我试图返回对成员函数内新转置Mat实例的引用。然而,我得到了坏的错误。但它在同一个代码中运行了好几次,我感到困惑。我还尝试将同样的想法扩展到加法运算符重载和链接 我不想返回this指针,因为成员函数应该是const。我想在member函数中创建一个新实例,并将对该新成员的引用作为输出返回。我现在在做这个,C++ 如何从成员函数返回对新对象实例的引用(在某些操作之后)?,c++,function,class,constants,C++,Function,Class,Constants,我正在尝试创建一个矩阵类“ECE_Matrix”。它将采用常数ECE_矩阵并执行所有一般操作。这些操作不应更改传递的实例 对于转置,我试图返回对成员函数内新转置Mat实例的引用。然而,我得到了坏的错误。但它在同一个代码中运行了好几次,我感到困惑。我还尝试将同样的想法扩展到加法运算符重载和链接 我不想返回this指针,因为成员函数应该是const。我想在member函数中创建一个新实例,并将对该新成员的引用作为输出返回。我现在在做这个, const ECE_Matrix& tran
const ECE_Matrix& transpose() const
{
ECE_Matrix M(m_col, m_row, 0);
std::vector<std::vector<double> > t_matrix( m_col, std::vector<double>(m_row, 0));
for (int i=0; i < m_row; ++i)
{
for (int j=0; j < m_col; ++j)
{
t_matrix[j][i] = m_matrix[i][j];
}
}
M.setMatrix(t_matrix);
const ECE_Matrix* mp = &M;
return *mp;
}
重载函数调用operation函数,通过以下函数返回对求和ECE_矩阵实例的引用
我在计算函数中两个矩阵的和:
const ECE_Matrix& operation(const ECE_Matrix &M1, const ECE_Matrix &M2, Operator opType) const
......CODE to calculate SUm.....
const ECE_Matrix* mp = &M; // M is of type ECE_Matrix whose member variable holds sum.
return *mp;
即使*mp正确地指向求和的实例,在返回它之后,重载函数中的结果_矩阵也不会得到中*mp所指的实例:
const ECE_Matrix ResultMatrix = operation(*this, M2, ADD);
发生了什么事?是不是有“this”指针?下一行
return *mp;
在文章的代码段末尾创建一个悬空指针,正如文章的前两条注释所指出的那样。正如@NathanOliver所指出的,我最终解决了按值返回的问题,同时使用const ref作为输入。或者,您可以在方法中创建ECE_矩阵类的新实例,如下所示:
ECE_Matrix M = new ECE_Matrix(m_col, m_row, 0);
问题是您将该指针的所有权转移到调用函数,这可能会导致混淆,并且经常(尤其是在较大的项目中)导致内存泄漏。
return*mp代码>返回对函数完成时超出范围的局部变量的引用->它成为悬挂引用为什么要返回引用?函数返回后,对局部变量的引用立即挂起。你应该按值返回。如果你按常量引用,并按值返回,你仍然可以不带任何UB@Rio1210按值返回应该有效。你能发布你失败的尝试吗?@rio1210它之所以有效,是因为按常量引用可以捕获临时值,而按值返回时所拥有的就是wick。非常量引用无法绑定到临时变量,因此您必须在原始代码中通过引用返回。请详细说明这是如何工作的?如何通过此方法将计算返回给调用函数?谢谢。它将在堆上创建ECE_Matrix类的一个新实例(而不是堆栈上的一个变量,该变量在函数完成时超出作用域)。您将返回指向ECE_矩阵新实例的指针。ECE_矩阵的实例将一直存在,直到您将其删除或应用程序退出。
ECE_Matrix M = new ECE_Matrix(m_col, m_row, 0);