关于使用用户定义的方法扩展 C++ STL 容器的更好方法的建议

2023-12-20

我继承自C++ STL容器,并向其中添加了我自己的方法。其基本原理是,对于客户来说,它看起来像是一个常规列表,但具有可以轻松调用的特定于应用程序的方法。

这工作得很好,但我读过很多关于不从 STL 继承的文章。有人可以提供具体建议,告诉我如何以更好的方式编写下面的代码吗?

class Item
{
  int a;
  int b;
  int c;

  int SpecialB()
  {
    return a * b + c;
  }
};

class ItemList : public std::vector<Item>
{
  int MaxA()
  {
    if( this->empty() )
      throw;

    int maxA = (*this)[0].a;

    for( int idx = 1; idx < this->size(); idx++ )
    {
      if( (*this)[idx].a > maxA )
      {
        maxA = (*this)[idx].a;
      }
    }
    return maxA;
  }

  int SpecialB()
  {
    if( this->empty() )
      throw;

    int specialB = (*this)[0].SpecialB();

    for( int idx = 1; idx < this->size(); idx++ )
    {
      if( (*this)[idx].SpecialB() < specialB )
      {
        specialB -= (*this)[idx].c;
      }
    }
    return specialB;
  }

  int AvgC()
  {
    if( this->empty() )
      throw;

    int cSum = 0;
    for( int idx = 0; idx < this->size(); idx++ )
    {
      cSum += (*this)[idx].c;
    }

    return cSum / this->size(); // average
  }
};

EDIT: 谢谢各位热心的解答。我将创建辅助函数,并且从现在开始将不再从 STL 容器继承。


这是一个bad idea.

不应该从 STL 类派生的原因有很多,其中最重要的是它们不是为此而设计的。 Vector 没有虚拟析构函数,因此如果扩展它,超类的析构函数可能无法正确调用,并且会出现内存泄漏。

有关此内容的更多信息,请参阅此答案以了解原因not源自std::string。许多相同的观点都适用:

构造函数不适用于从 std::string 继承的类 https://stackoverflow.com/questions/555612/constructor-doesnt-work-for-class-inherited-from-stdstring/555633#555633

  • 没有虚拟析构函数
  • 没有受保护的函数(因此继承不会带来任何好处)
  • 多态性不起作用,你会得到对象切片。std::vector是可分配的,但如果您添加自己的字段,并且从向量指针或向量引用分配,则它们不会在分配时被复制。这是因为vector's operator=不了解你的领域。

出于所有这些原因,当涉及到 STL 时,最好制作实用函数而不是进行扩展。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于使用用户定义的方法扩展 C++ STL 容器的更好方法的建议 的相关文章

随机推荐