避免派生 class 的赋值运算符中的重复
avoiding duplication in the assignment operator of a derived class
考虑下面 类 Parent
和 Child
中的赋值运算符。
#include <iostream>
class Parent
{
public:
Parent(){};
virtual ~Parent(){};
Parent& operator=(const Parent& other){mP = other.mP; return *this;};
void setP(double inP){mP = inP;};
double getP(){return mP;};
protected:
double mP;
};
class Child : public virtual Parent
{
public:
Child(){};
virtual ~Child(){};
Child& operator=(const Child& other)
{
mC = other.mC;
mP = other.mP;// this line
return *this;
};
void setC(double inC){mC = inC;};
double getC(){return mC;};
protected:
double mC;
};
这里有避免重复行的方法吗mP = other.mP;
?
我问的原因是随着基数越来越多,继承结构越来越复杂,很容易失去对成员的追踪。
编辑
我需要实现 operator=
的原因是它需要在赋值之前检查一些东西。
只需调用 Parent 运算符:
Child& operator=(const Child& other)
{
mC = other.mC;
Parent::operator=(other);
return *this;
}
或者真的,不要实现任何一个运算符,因为它们都是微不足道的!
Child& operator=(const Child& other) {
mC = other.mC;
mP = other.mP;
}
您可以通过这种方式在特定于子项的赋值之前调用父项的赋值运算符:
Child& operator=(const Child& other)
{
Parent::operator=(other);
mC = other.mC;
return *this;
};
避免此问题的最佳方法是删除两个 operator=
函数。
编译器生成的 operator=
将 operator=
应用于每个成员变量和基数 class,这正是您想要做的。
重新实现轮子只会让您的代码更难阅读和维护——有时效率也会降低。
考虑下面 类 Parent
和 Child
中的赋值运算符。
#include <iostream>
class Parent
{
public:
Parent(){};
virtual ~Parent(){};
Parent& operator=(const Parent& other){mP = other.mP; return *this;};
void setP(double inP){mP = inP;};
double getP(){return mP;};
protected:
double mP;
};
class Child : public virtual Parent
{
public:
Child(){};
virtual ~Child(){};
Child& operator=(const Child& other)
{
mC = other.mC;
mP = other.mP;// this line
return *this;
};
void setC(double inC){mC = inC;};
double getC(){return mC;};
protected:
double mC;
};
这里有避免重复行的方法吗mP = other.mP;
?
我问的原因是随着基数越来越多,继承结构越来越复杂,很容易失去对成员的追踪。
编辑
我需要实现 operator=
的原因是它需要在赋值之前检查一些东西。
只需调用 Parent 运算符:
Child& operator=(const Child& other)
{
mC = other.mC;
Parent::operator=(other);
return *this;
}
或者真的,不要实现任何一个运算符,因为它们都是微不足道的!
Child& operator=(const Child& other) {
mC = other.mC;
mP = other.mP;
}
您可以通过这种方式在特定于子项的赋值之前调用父项的赋值运算符:
Child& operator=(const Child& other)
{
Parent::operator=(other);
mC = other.mC;
return *this;
};
避免此问题的最佳方法是删除两个 operator=
函数。
编译器生成的 operator=
将 operator=
应用于每个成员变量和基数 class,这正是您想要做的。
重新实现轮子只会让您的代码更难阅读和维护——有时效率也会降低。