【问题标题】:I need assignment operator back我需要赋值运算符
【发布时间】:2019-01-01 05:25:24
【问题描述】:

我有很多类继承自一些Base

在某个时候const 成员(非静态)被添加到Base 类。为了初始化它,我向Base 和孩子添加了构造函数。

但是(据我了解)此操作删除了默认赋值运算符。我需要这个操作员回来。 现在我需要为从“Base”继承的每个类添加自定义赋值运算符。 有很多课。解决这种情况的最简单方法是什么?

UPD:简单示例

class SerializationBase : {
    const SerializationType type;
    ... 
    public:
    SerializationType GetType() {return type;}
}

class SomeObject : public SerializationBase {
   ... // a lot of different fields
   public:
   SomeObject() : SerializationBase(SerializationType::SomeType);
}

class SomeAnotherObject : public SerializationBase {
   ... // a lot of different fields
   public:
   SomeAnotherObject() : SerializationBase(SerializationType::SomeAnotherType);
}

添加const SerializationType后不起作用的代码:

SomeObject some = Deserialize<SomeObject>(serializedData);

Deserialize 在哪里:

template <typename T>
T Deserialize(SerializedData);

我想要什么:让它发挥作用的最简单方法。 (也许是赋值运算符的一些类上下文无关的实现,我可以在每个类中复制粘贴)

【问题讨论】:

  • 基础成员真的需要是 const 吗?如果确实如此,将一个碱基分配给另一个碱基意味着什么?
  • 你能给我们一个minimal reproducible example吗?
  • 谢谢。给我几分钟来简化代码。
  • 定义Base::operator=就足够了。有了这个,隐式定义的运算符应该适用于派生类。

标签: c++ operator-overloading assignment-operator


【解决方案1】:

问题是要实现默认的赋值运算符,你需要处理 const 成员。

有 3 个选项供您选择:

  1. 在基类中实现您自己的赋值运算符。您必须弄清楚如何处理该成员,因为您将无法更改它的值。所有其他类将自动依赖您的自定义赋值运算符,并应为它们生成默认赋值运算符。
  2. 从成员中删除 const。现在默认分配应该可以正常工作,并且会被所有其他类自动继承。
  3. 将您的班级分为可分配基础和不可分配基础。不可分配的基础只有 const 成员并从可分配的成员继承。您现在需要四处走动,将类更改为从正确的基础版本继承。

我会选择第一个选项,但我不知道该 const 成员的具体情况。

【讨论】:

  • 我将替换第一句中的“覆盖”。 “覆盖”在 C++ 中具有非常特殊的含义,但事实并非如此。 “处理”可能会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 2019-10-06
  • 2011-11-16
  • 2013-11-30
  • 2015-10-02
  • 1970-01-01
相关资源
最近更新 更多