在 C++ 中重载 parent 和 child class 中的 + 和 += 运算符
Overloading + and += operators in parent and child class in C++
好吧伙计们,这个让我很困惑,尤其是因为网上关于这个的信息太少了……
好吧,假设我有一个 parent 和一个 child class 这样的:
class ParentPlot
{
public:
int a;
int b;
datacontainer Events;
friend ParentPlot& operator+(ParentPlot& plotA, const ParentPlot& plotB)
{
//add stuff
return sumPlot;
}
virtual ParentPlot operator+=(const ParentPlot &plotB)
{
//+= stuff using 'this'
return *this;
}
}
class ChildPlot: public ParentPlot
{
public:
int q;
friend ChildPlot& operator+(ChildPlot& plotA, const ChildPlot& plotB)
{
//Static cast and add the parents.
ParentPlot PlotACast = static_cast<ParentPlot>(plotA); //2 Static casts
ParentPlot PlotBCast = static_cast<ParentPlot>(plotB);
ParentPlot ParentSum = PlotACast + PlotBCast; //Add as ParentPlots
ChildPlot BasePlot = ChildPlot(ParentSum);
//Add child members
BasePlot.q = plotA.q + plotB.q;
return BasePlot;
}
ChildPlot& operator+=(const ChildPlot& plotB)
{
//How do I correctly implement this?
}
}
我应该如何正确管理这些 classes 的加法和 +=?每个组合似乎都会出现某种错误,我无法让它工作。例如上面实现的方法给出了以下错误:
“此运算符函数的参数太少”
我试过使 ParentPlot 成为抽象的 class 然后在 child class 中实现,但是加法运算符中断,因为我不能 return a parent 在加法运算符中。
从技术上讲,ParentPlot 将是抽象的,但会有许多 children 需要求和,并且它有多个成员。我不应该为 parent 而只为 children 实现加法运算符或 += 还是我遗漏了什么?真的不知道处理这个问题的正确方法。任何想法都会有所帮助...
谢谢
1。修复您的运算符 return 类型。
operator +
应该return一份。 operator +=
应该 return 引用 this
.
friend ParentPlot operator+(ParentPlot& plotA, const ParentPlot& plotB)
ParentPlot& operator+=(const ParentPlot &plotB)
friend ChildPlot operator+(ChildPlot& plotA, const ChildPlot& plotB)
ChildPlot& operator+=(const ChildPlot& plotB)
2。使用 operator +=
实现您的 operator +
这个小技巧可以使您的代码变干,并且可以更轻松地实现这些额外的运算符。
请注意,第一个参数是按值获取的,我们需要一个将由 operator +=
.
修改的副本
friend ParentPlot operator+(ParentPlot plotA, const ParentPlot& plotB)
{
return plotA += plotB;
}
friend ChildPlot operator+(ChildPlot plotA, const ChildPlot& plotB)
{
return plotA += plotB;
}
3。实施子 operator +=
假设您已经有 operator +=
用于 ParentPlot
,您可以通过两种方式使用它:
static_cast<ParentPlot&>(*this) += plotB;
//or
ParentPlot::operator+=(plotB);
然后像往常一样添加特定于儿童的实现和 return *this;
。
完整代码(see it online):
class ParentPlot {
public:
int a;
int b;
friend ParentPlot operator+(ParentPlot plotA, const ParentPlot& plotB)
{
return plotA += plotB;
}
ParentPlot& operator+=(const ParentPlot& plotB)
{
a += plotB.a;
b += plotB.b;
return *this;
}
};
class ChildPlot : public ParentPlot {
public:
int q;
friend ChildPlot operator+(ChildPlot plotA, const ChildPlot& plotB)
{
return plotA += plotB;
}
ChildPlot& operator+=(const ChildPlot& plotB)
{
//static_cast<ParentPlot&>(*this) += plotB;
ParentPlot::operator+=(plotB);
q += plotB.q;
return *this;
}
};
好吧伙计们,这个让我很困惑,尤其是因为网上关于这个的信息太少了……
好吧,假设我有一个 parent 和一个 child class 这样的:
class ParentPlot
{
public:
int a;
int b;
datacontainer Events;
friend ParentPlot& operator+(ParentPlot& plotA, const ParentPlot& plotB)
{
//add stuff
return sumPlot;
}
virtual ParentPlot operator+=(const ParentPlot &plotB)
{
//+= stuff using 'this'
return *this;
}
}
class ChildPlot: public ParentPlot
{
public:
int q;
friend ChildPlot& operator+(ChildPlot& plotA, const ChildPlot& plotB)
{
//Static cast and add the parents.
ParentPlot PlotACast = static_cast<ParentPlot>(plotA); //2 Static casts
ParentPlot PlotBCast = static_cast<ParentPlot>(plotB);
ParentPlot ParentSum = PlotACast + PlotBCast; //Add as ParentPlots
ChildPlot BasePlot = ChildPlot(ParentSum);
//Add child members
BasePlot.q = plotA.q + plotB.q;
return BasePlot;
}
ChildPlot& operator+=(const ChildPlot& plotB)
{
//How do I correctly implement this?
}
}
我应该如何正确管理这些 classes 的加法和 +=?每个组合似乎都会出现某种错误,我无法让它工作。例如上面实现的方法给出了以下错误:
“此运算符函数的参数太少”
我试过使 ParentPlot 成为抽象的 class 然后在 child class 中实现,但是加法运算符中断,因为我不能 return a parent 在加法运算符中。
从技术上讲,ParentPlot 将是抽象的,但会有许多 children 需要求和,并且它有多个成员。我不应该为 parent 而只为 children 实现加法运算符或 += 还是我遗漏了什么?真的不知道处理这个问题的正确方法。任何想法都会有所帮助...
谢谢
1。修复您的运算符 return 类型。
operator +
应该return一份。 operator +=
应该 return 引用 this
.
friend ParentPlot operator+(ParentPlot& plotA, const ParentPlot& plotB)
ParentPlot& operator+=(const ParentPlot &plotB)
friend ChildPlot operator+(ChildPlot& plotA, const ChildPlot& plotB)
ChildPlot& operator+=(const ChildPlot& plotB)
2。使用 operator +=
实现您的 operator +
这个小技巧可以使您的代码变干,并且可以更轻松地实现这些额外的运算符。
请注意,第一个参数是按值获取的,我们需要一个将由 operator +=
.
friend ParentPlot operator+(ParentPlot plotA, const ParentPlot& plotB)
{
return plotA += plotB;
}
friend ChildPlot operator+(ChildPlot plotA, const ChildPlot& plotB)
{
return plotA += plotB;
}
3。实施子 operator +=
假设您已经有 operator +=
用于 ParentPlot
,您可以通过两种方式使用它:
static_cast<ParentPlot&>(*this) += plotB;
//or
ParentPlot::operator+=(plotB);
然后像往常一样添加特定于儿童的实现和 return *this;
。
完整代码(see it online):
class ParentPlot {
public:
int a;
int b;
friend ParentPlot operator+(ParentPlot plotA, const ParentPlot& plotB)
{
return plotA += plotB;
}
ParentPlot& operator+=(const ParentPlot& plotB)
{
a += plotB.a;
b += plotB.b;
return *this;
}
};
class ChildPlot : public ParentPlot {
public:
int q;
friend ChildPlot operator+(ChildPlot plotA, const ChildPlot& plotB)
{
return plotA += plotB;
}
ChildPlot& operator+=(const ChildPlot& plotB)
{
//static_cast<ParentPlot&>(*this) += plotB;
ParentPlot::operator+=(plotB);
q += plotB.q;
return *this;
}
};