【问题标题】:Convert parent object to child in c++ with overloaded operatorsc++ - 使用重载运算符将父对象转换为子对象
【发布时间】:2016-03-02 05:52:46
【问题描述】:

我有一个任务,我们应该使用父/子类重载运算符,并且我想将父对象转换为子对象。所以就像船 + 飞机 = 水上飞机。

一个实现示例:

seaPlane plane::operator+=(boat rhs)
{
    seaPlane temp;

    temp.displacement = rhs.displacement;
    // etc...
    *this = temp;
    return *this;
}

我在这里遇到两个错误:它说船数据成员不可访问,并且“不存在合适的用户定义转换......”。

知道我将对象存储在异构集合中也可能很有用。

【问题讨论】:

  • 您确定需要重载 += 运算符而不仅仅是 + 吗?顺便说一句,如果这些车辆有一个共同的基类,那么您也许可以为您的收藏使用更简单的容器。
  • 如果我们超载 + 而不是 += ,教练会为了保持一致性而叮嘱我们。这就是这个练习的主要目的。另外,我在重载 + 中遇到了相同的(第一个)错误。此外,异构集合是使用继承的主要原因之一。
  • 这对你的导师来说似乎是一件很奇怪的事情,你已经偶然发现了原因。您不能分配给“this”指针,因为它是纯右值并且不能分配给(除非重新定义分配以执行其他操作)。 += 运算符旨在累积而不是重新定义,因此这似乎是对它应该做的事情的错误操作。您能否向我们提供有关要求的更多信息?您应该逐字发布它们,以便我们帮助解释它们。

标签: c++ type-conversion operator-overloading parent-child


【解决方案1】:

很遗憾,我没有对 Jonathan Smit 的回答发表评论所需的声誉。

我同意boat的数据成员的访问级别是一个问题,但是由于+=(或+,如果您遵循其他建议)的实现是在类平面中,您需要有

class boat{
  friend class plane;
  // class definition as before
};

很抱歉将其单独作为一个答案,我觉得它最好用作评论。

【讨论】:

  • 您好,您的回答已得到妥善记录。我添加了该更改。感谢您指出! :)
【解决方案2】:

对于您的第一个错误,您应该尝试执行以下操作。检查您的船类中成员变量的访问权限。它们都是私有的还是受保护的?如果是这样,那么您可以在节点类中声明 seaPlane 类是友元类。这应该可以让您访问。

类似的东西。

class boat{
friend class plane;
//some code
}

否则,您可以公开成员变量以允许访问。最好的选择是基于您的实施和您想要的。

最后,正如您问题中的 cmets 所指出的那样,更容易重载 +。

【讨论】:

  • 感谢您的回复。我不确定我们是否可以使用朋友,所以我必须检查一下。公开数据成员肯定会对分数产生影响,因此这是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多