gpt4 book ai didi

c++ - 如何从成员函数返回对新对象实例的引用(在某些操作之后)?

转载 作者:行者123 更新时间:2023-11-28 04:10:17 24 4
gpt4 key购买 nike

我正在尝试创建一个 Matrix 类“ECE_Matrix”。它将采用常量 ECE_Matrix 并执行所有常规操作。这些操作不应更改传递的实例。

对于转置,我试图在成员函数内返回对新转置 Mat 实例的引用。但是,我收到 bad_alloc 错误。但是它使用相同的代码工作了几次,我很困惑。我也在尝试将相同的想法扩展到附加运算符重载和链接。

我不想返回 this 指针,因为成员函数应该是常量。我想在成员函数中创建一个新实例,并返回对该新成员的引用作为输出。我目前正在这样做,

    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;

}

但是,这在运行时给我 bad_alloc 错误(虽然程序正在编译。)

此外,在尝试对 + 运算符的运算符重载做类似的事情时,我遇到了类似的问题:

我正在尝试运算符重载,例如:

const ECE_Matrix& ECE_Matrix::operator+(ECE_Matrix &M2) const
{
ECE_Matrix M2(this->getRow(), this->getCol(), value);
const ECE_Matrix ResultMatrix = operation(*this, M2, ADD);
const ECE_Matrix* mp = &ResultMatrix;
return *mp;
}

重载函数调用操作函数以通过以下函数返回对求和的 ECE_Matrix 实例的引用。

我正在计算函数中两个矩阵的总和:

 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 正确指向求和实例,返回它后,重载函数中的 Result_Matrix 也没有得到 *mp 指向的实例:

const ECE_Matrix ResultMatrix = operation(*this, M2, ADD);

这是怎么回事?它与“this”指针有关吗?

最佳答案

下面一行

  return *mp;

在帖子中的代码片段末尾创建一个悬挂指针,正如帖子的前两条评论所指出的那样。我终于解决了按值返回的问题,同时按照@NathanOliver 指出的那样将 const ref 作为输入。

关于c++ - 如何从成员函数返回对新对象实例的引用(在某些操作之后)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57948390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com