Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;具有相同数据结构的类_C++_Inheritance_Design Patterns - Fatal编程技术网

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

C++ C++;具有相同数据结构的类,c++,inheritance,design-patterns,C++,Inheritance,Design Patterns,我有一个基类,它包含一些数据结构,还有一个派生类,它包含完全相同的数据,但被赋予了一些额外的函数,比如(为了具体起见): 但我想避免不必要的拷贝 有没有一种方法可以简单而安全地重新解释具有相同底层数据结构的对象?或者是一种设计模式,用(相当大的)函数集来修饰数据结构,从而完全避免问题?您可以重载函数,仅此而已: struct Derived : public std::vector<double> { using std::vector<double>::vect

我有一个基类,它包含一些数据结构,还有一个派生类,它包含完全相同的数据,但被赋予了一些额外的函数,比如(为了具体起见):

但我想避免不必要的拷贝


有没有一种方法可以简单而安全地重新解释具有相同底层数据结构的对象?或者是一种设计模式,用(相当大的)函数集来修饰数据结构,从而完全避免问题?

您可以重载函数,仅此而已:

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;
}
结构派生:公共std::vector{ 使用std::vector::vector; 内联双范数()常量{return norm(*this);} 静态双范数(const std::vector&)const; } 现在,您可以调用
派生的::norm(obj)
派生的.norm()
,其中:

  • obj
    是一种
    std::vector
  • 派生的
    是类
  • derived
    是类型为
    derived

如果要将派生的视为其基础,请使用其基础。

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

double norm(const std::vector<double>& v)
{
    // ...
}
双范数(const std::vector&v)
{
// ...
}
这完全避免了这个问题


(请注意,)

您可以使用
静态\u cast
,但这将是非常不安全的类型。这闻起来像个XY问题。你想解决什么实际问题。不,不是问题中提到的那个,而是你认为答案涉及到问题中提到的奇怪的类结构的问题。你不应该从std容器派生,因为它们缺少你的程序不崩溃所需的某些功能,比如虚拟析构函数。最好有一个受保护的向量成员。为了避免这种情况,你必须不做某些你应该能够自由地使用你的类设计的事情,或者通过向标准库添加运行时开销或者破坏类静态或接口类来削弱整个世界的C++代码库。同样好的是,你进入了不继承std::vector。我一直在考虑这个问题。缺点是(1)一侧有大量调用分组(名称空间?)的函数;(2) 由于基是一个[non-std,Thank]容器,对于不同的派生对象,所包含的数据和相应的函数集可能有不同的解释。对于(2),这就是类型系统的用途。“对所含数据的不同解释”应该意味着“不同类型”,否则你会给自己带来麻烦。如果有不同的类型,那么您可以重载
norm
,这样您就没有问题了。此外,可能尝试完全放弃继承——通常情况下,继承是不必要的(如果派生对象不能始终用作基础对象,那么继承是有害的)。也许一个数据类和许多引用数据的“包装器”类会有所帮助。如果你展示更多的代码,也许我们可以帮助解决这个问题。链接问题的标题可能是你想说的,但页面上实际上说它没那么糟糕。但你是对的,自由函数是最好的答案。使用std::norm做
也是合理的和用标准函数重载自定义数学函数。这看起来很像我正在寻找的,尽管对于每个
派生的
对象大约30个函数来说,这可能有点打字,或者是糟糕的宏?
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;
}
double norm(const std::vector<double>& v)
{
    // ...
}