2016-10-04 174 views
1

我有一个包含一些数据结构的基类,和含有完全相同数据,但赋有一些额外的功能,比如(为明确起见)一些派生类:C++类具有相同的数据结构

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

    double norm() const; 
} 

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

  • Derived可以从它的底座(构造用使用申报进口中的例子)来构建,
  • Derived和ITSS基地有着完全相同的数据成员。

我可以打电话:

Derived(obj).norm() 

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

有没有一种方法可以简单安全地重新解析具有相同底层数据结构的对象?或者,也许设计模式为着装具有(相当大的)功能集的数据结构可以完全避免该问题?

+1

你可以使用'static_cast',但这将是严重类型不安全。这味道像一个XY问题。你试图解决什么样的实际问题。不,不是问题中提到的问题,而是你认为的答案涉及问题中提到的怪异类结构。 –

+0

你不应该从std容器派生,因为它们缺少某些你可能需要的程序不会崩溃的特性,比如虚拟析构函数。 has_a受保护的向量成员可能会更好。为了避免这种情况,你必须不要做某些你应该能够自由地使用你的类设计的东西,或者通过增加运行时开销到标准库来瘫痪整个世界的C++代码库。 –

回答

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,仿佛这是它的基地,使用其基地。

+0

这看起来非常像我要找的东西,虽然对于每个“派生”对象大约30个函数,它可能有点打字 - 或者可怕的宏? – Lio

3

的惯用方法是提供的,而不是成员函数自由函数:

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

这完全避免了这个问题。

(并请,don't inherit std::vector

+0

或类静态或接口类。也很好,你有没有继承std :: vector。 –

+0

我一直在想这个。缺点是(1)需要分组的大量函数(名称空间?); (2)基础是一个[非标准的,感谢]容器,对于不同的派生对象可能有不同的对包含的数据和相应的函数集的解释。 – Lio

+0

对于(2),这是类型系统的用途。 “对所含数据的不同解读”应该暗示“不同类型”,否则你就会陷入困境。如果有不同的类型,那么你可以重载'norm'并且你没有问题。 –

相关问题