gpt4 book ai didi

c++ - 抽象类和运算符!= 在 C++ 中

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:27 25 4
gpt4 key购买 nike

我在从抽象类派生的集合类中实现 operator!= 时遇到问题。代码如下所示:

class Abstract
{
public:
//to make the syntax easier let's use a raw pointer
virtual bool operator!=(const Abstract* other) = 0;
};

class Implementation
{
SomeObject impl_; //that already implement the operator!=
public:
bool operator!=(const Abstract* other)
{
return dynamic_cast<Implementation*>(other)->impl_ != this->impl_;
}
};

此代码有效,但它有使用 dynamic_cast 的缺点,我需要处理转换操作中的错误。

这是一个普遍的问题,当一个具体类的函数试图使用一些内部信息(在抽象类级别不可用)来执行任务时会发生这种问题。

有没有更好的办法解决这类问题?

干杯

最佳答案

您不想在基类中实现相等运算符 ==!=。基类不知道后代的数量和内容。

例如,使用Shape类的例子:

struct Shape
{
virtual bool equal_to(const Shape& s) const = 0; // Makes Shape an abstract base class.
bool operator==(const Shape& s) const
{
return equal_to(s);
}
bool operator!=(const Shape& s) const
{
return !equal_to(s);
}
};

struct Square : public Shape
{
bool equal_to(const Shape& s) const;
};

struct Circle : public Shape
{
bool equal_to(const Shape& s) const;
};

struct Flower : public Shape
{
bool equal_to(const Shape& s) const;
};

struct Cloud : public Shape
{
bool equal_to(const Shape& s) const;
};

为了满足 Shape 类的相等运算符,每个后代都必须实现 equal_to 方法。 等等,Square 怎么知道另一个 Shape 是什么类型?

在此示例中,Square 类需要在引用上使用 dynamic_cast 以转换为 Square 对象。当参数是 CircleFlowerCloud 或其他一些尚未定义的形状时,这将失败。

以下是您必须注意的有效概念:

Square my_square;
Cloud my_cloud;
Shape * p_shape_1 = &my_square; // Square is-a Shape, so this is legal.
Shape * p_shape_2 = &my_cloud; // Cloud inherits from Shape, so this is legal.

if (*p_shape_1 == *p_shape_2) // Legal syntax because of Shape::operator==().
{ //???}

上面的比较调用了讨厌的行为。这可能发生在仅对形状进行操作的通用函数中。

决议

更改设计。您永远不应该在基类中放置与基类进行比较的公共(public)比较运算符。可恶的。

后代比较后代。期间。方对方,花对花,圆对圆。在后代类中实现比较运算符。

比较基类内容:如果您在基类中有共享内容,实现一个 protected 方法来仅比较基类方法:

struct Shape
{
protected:
bool equal_shape_content(const Shape& s) const;
};

这将使您的程序更加健壮,因为它只将 Shape 的内容与另一个 Shape 进行比较。这就是您可以保证的所有内容。另请参阅基类切片

关于c++ - 抽象类和运算符!= 在 C++ 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4669966/

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