在两者中使用基类和派生类作为数组时的循环

Posted

技术标签:

【中文标题】在两者中使用基类和派生类作为数组时的循环【英文标题】:Circularity when using base and derived class as arrays in both 【发布时间】:2016-05-31 14:02:11 【问题描述】:

我正在尝试创建一个包含 NBT 格式中指定的任意值的类。是json的一种,但更高级。

所以,我创建了一个类,其中包含一个 ListValue(一个没有名称的值)和另一个包含一个值(有名称)的类。在派生类中,我从基类中提升 = 运算符

using ListValue::operator=;

在第三个文件中,我有两个用途:

using CompoundData = std::vector<Value>;
using ListData = std::vector<ListValue>;

ListValue 有一个私有成员:

union ValueHolder

    Byte vByte;
    Short vShort;
    Int vInt;
    Long vLong;
    Float vFloat;
    Double vDouble;
    String* pString;
    CompoundData* pCompound;
 mData;

(稍后我会添加 ListData*)

问题是我完全不知道如何包含所有这些标题,以便它可以处理循环。我尝试了几个前向声明和容器作为向量或带有智能指针的向量来破坏它,但对我没有任何作用。

如果您能帮助我为我的代码提供一个想法/解决方案,我将不胜感激。非常感谢。

【问题讨论】:

您应该尝试创建一个最小的示例来重现您的问题。编译器消息通常是一个很好的起点。 循环几乎总是来自设计上的错误...改变设计没有循环,你以后会省去很多麻烦。你有很多选择来实现这一点,我想到的第一个是多态 什么是NBT格式?另外,为什么你的类型被大写?错字? 您是否意识到union 将占用与最大成员一样多的空间?我之所以问,是因为我看到 Byte 类型与 Long 类型一起列出,这似乎浪费空间。 由于此处发布的代码未提及任何标头,因此无法解释如何“包含所有这些标头”。显示真实代码,而不是手动描述。 【参考方案1】:

简单的方法是:

struct CompoundData;
struct ListData;

然后在别处:

struct CompoundData : std::vector<Value> 
  using std::vector<Value>::vector;
  CompoundData& operator=(std::vector<Value> const& o) 
    static_cast<std::vector<Value>&>(*this)=o;
    return *this;
  
  CompoundData& operator=(std::vector<Value> && o) 
    static_cast<std::vector<Value>&>(*this)=std::move(o);
    return *this;
  
  CompoundData(std::vector<Value> const& o):
    std::vector<Value>(o)
  
  CompoundData(std::vector<Value> && o):
    std::vector<Value>(std::move(o))
  
  CompoundData()=default;
  CompoundData(CompoundData const&)=default;
  CompoundData(CompoundData &&)=default;
  CompoundData& operator=(CompoundData const&)=default;
  CompoundData& operator=(CompoundData &&)=default;
;

这是一堆样板,上面写着“不,我与我继承的 std::vector 并没有什么不同”,ListData 也是如此。

【讨论】:

以上是关于在两者中使用基类和派生类作为数组时的循环的主要内容,如果未能解决你的问题,请参考以下文章

基类和派生类

关于基类和派生类之间的关系

生成一个派生类对象时,调用基类和派生类构造函数按啥次序

以基类作为数据成员的派生类?

C#编程,关于基类和派生类

在 Blazor 中使用基类和派生类绑定