gpt4 book ai didi

c++覆盖一个已经定义的变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:00 25 4
gpt4 key购买 nike

我有以下主要功能,使用指针创建系数的乘积。这只是项目的一小部分,用于创建多项式:

#include "header.h"
int main()
{
TermProd x = TermProd( new Coeff(4), new Coeff(8));
x.print(); cout << endl;
x = TermProd( new Coeff(8), new Coeff(15));
x.print(); cout << endl;
return 0;
}

经过测试,覆盖似乎起作用了。但是当我在 x 上调用打印时,出现段错误。我一直在尝试并盯着它看了很长一段时间,但我无法找出真正的问题。此外,我的搜索没有找到正确的方向,所以我决定创建一个小的代码片段来重现错误。

我的 header.h 文件如下所示:

class Term{
public:
Term(){};
virtual ~Term(){};
virtual Term* clone() const = 0;
virtual void print() const = 0;
};

class Coeff:public Term{
int m_val; //by def: >=0
public:
// Constructor
Coeff();
Coeff(int val = 1):m_val(val)
// Copy constructor
Coeff* clone() const{return new Coeff(this->val());}
// Destructor
~Coeff(){}
// Accessors
int val() const{return m_val;} ;
// Print
void print() const{cout << m_val; }
};

class TermProd:public Term{
TermPtr m_lhs, m_rhs;
public:
// Constructor
TermProd(TermPtr lhs, TermPtr rhs):m_lhs(lhs), m_rhs(rhs){ }
// Copy constructor
TermProd* clone() const
{
return new TermProd(m_lhs->clone(), m_rhs->clone());
}
// Destructor
~TermProd(){ delete m_lhs;delete m_rhs;}
// Accessors
Term* lhs() const { return m_lhs; }
Term* rhs() const { return m_rhs; }
// Print
void print() const
{
cout << "("; m_lhs->print(); cout << '*'; m_rhs->print(); cout << ")";
}
};

最佳答案

注意这里你没有覆盖x变量,而是分配给它。这将调用默认 operator=对于您的类型,它大致导致执行以下代码

  1. 构造函数TermProd::TermProd(TermPtr, TermPtr)被执行
  2. m_lhsm_rhs被复制到值 x
  3. 在步骤#1 中创建的值的析构函数现在运行并且 m_lhsm_rhs被删除

此时你遇到了一个真正的问题。在步骤#2 之后,两个值 x并且在步骤 #1 中创建的临时值共享相同的 m_lhsm_rhs值。第 3 步的析构函数删除了它们 x仍然有对它们的引用,现在有效地指向死内存

为了解决这个问题,您需要添加自己的 operator=正确处理赋值语义。例如

TermProd& operator=(const TermProd& other) {
if (&other != this) {
delete m_lhs;
delete m_rhs;

m_lhs = other.m_lhs->clone();
m_rhs = other.m_rhs->clone();
}
return *this;
};

为了在所有情况下都是正确的,您还需要添加一个适当的复制构造函数

TermProd::TermProd(const TermProd& other) :
m_lhs(other.m_lhs->clone()),
m_rhs(other.m_rhs->clone())
{

}

不过要使这变得极其简单,您应该考虑使用 std::shared_ptr<Term>作为 TermPtr 的值.它是一个指针,可以在没有上述所有开销的情况下进行共享

关于c++覆盖一个已经定义的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9036051/

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