具有相同数据结构的C ++类

时间:2016-10-04 16:09:06

标签: c++ inheritance design-patterns

我有一个包含一些数据结构的基类,以及一些包含完全相同的数据的派生类,但赋予了一些额外的功能,比如说(为了具体):

struct Derived : public std::vector<double>
{
    // Constructors, define or inherit
    using std::vector<double>::vector;

    double norm() const;
}

现在在代码的另一部分中,我想在基类型norm()的对象obj上调用函数std::vector<double>。通常这没有意义,但在这里:

  • Derived可以从它的基础构造(构造函数是在示例中使用using声明导入的),
  • Derived和itss base具有完全相同的数据成员。

我可以打电话:

    Derived(obj).norm()

但我想避免不必要的副本。

有没有办法简单安全地重新解释具有相同底层数据结构的对象?或者也许是着装数据结构的设计模式,有(相当大的)函数集可以完全避免这个问题?

2 个答案:

答案 0 :(得分:3)

惯用的方法是提供免费功能而不是成员函数:

double norm(const std::vector<double>& v)
{
    // ...
}

这完全避免了这个问题。

(请,don't inherit std::vector

答案 1 :(得分:0)

您可以重载该功能以及全部:

struct Derived : public std::vector<double> {
    using std::vector<double>::vector;
    inline double norm() const { return norm(*this); }
    static double norm(const std::vector<double> &) const;
}

现在,您可以调用Derived::norm(obj)derived.norm(),其中:

  • objstd::vector<double>
  • Derived是班级
  • derived是类型为Derived
  • 的对象

如果您希望对待 Derived,就好像它是它的基础,请使用它的基础。