加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如果我真的想要继承STL容器,并且继承构造函数并删除新运算

发布时间:2020-12-16 09:22:02 所属栏目:百科 来源:网络整理
导读:假设我违反了我在本网站和其他网站上发现的所有建议,并做了类似这样的事情: #include vector#include array#include iostreamusing PointType = std::arraydouble,3;class Point: public PointType { public: using PointType::PointType; Point(const Poin
假设我违反了我在本网站和其他网站上发现的所有建议,并做了类似这样的事情:

#include <vector>
#include <array>
#include <iostream>

using PointType = std::array<double,3>;
class Point
:
    public PointType 
{
    public: 

        using PointType::PointType;

        Point(const Point& copy)
            :
                PointType(copy)
        {
            std::cout << "Point(const Point&)" << std::endl;
        }

        Point(Point&& rval)
            :
                PointType(rval)
        {
            std::cout << "Point(Point&&)" << std::endl;
        }

        // Prevent PolygonType* p = new Polygon; delete p;
        template<typename ...Args>
        void* operator new (size_t,Args...) = delete;
};

using PolygonType = std::vector<PointType>; 
class Polygon
:
    public PolygonType
{
    public: 

        using PolygonType::PolygonType;

        Polygon(const Polygon& copy)
            :
                PolygonType(copy)
        {
            std::cout << "Polygon(const Polygon&)" << std::endl;
        }

        Polygon(Polygon&& rval)
            :
                PolygonType(rval)
        {
            std::cout << "Polygon(Polygon&&)" << std::endl;
        }

        // Prevent PolygonType* p = new Polygon; delete p;
        template<typename ...Args>
        void* operator new (size_t,Args...) = delete;
};

如果我对从未使用Point或Polygon或类似类型的new感到满意,删除new运算符会解决未定义行为的问题:

std::array<double,3> a = new Point({1.,2.,3.})
delete a;

std :: vector< PointType>上的条件由对其起作用的算法强加的算法是:算法检查公共接口是否适合算法中的操作.如果我想要一个算法(函数模板)来查看这个点向量作为线段的开链或闭合多边形,这是一个问题.这解析了在解析函数模板候选时依赖于隐式接口.此外,概念在它们到达时对我没有帮助,因为同样,容器上的条件是相同的,我希望算法对它们做的不同.因此,如果我执行标记调度with SFINAE using the new metafunctions from type_traits以检查模板参数是否已使用特定标记进行标记,那么使用这样的具体类型并标记它们会使标记调度变得微不足道.

C 11构造函数继承也使得重新键入构造函数的旧问题消失了.

那么,当继承STL并继承构造函数并删除new运算符时,仍会爆炸的是什么?必须有一些我没有看到的东西.

解决方法

如果您的对象将始终静态或自动分配(不是新的),那么它将以相同的方式被破坏,因此您不需要虚拟析构函数,因此这将按预期工作.

从标准容器中获取并非完全禁止,这只是危险的.通过消除危险的用例,您似乎在很大程度上减轻了危险.

请注意,如果您确实允许动态分配然后通过指向基类的删除,即使派生类没有自己的状态(即没有成员),您仍然有UB.对象生命周期比仅计算数据成员要复杂得多.

您仍然可以允许动态分配,并且永远不会通过指向基础的指针进行删除,但是这在逻辑上是否适合您,更不用说足够的保护性,仅取决于上下文.

轶事:我偶尔会从“图书馆代码”中的矢量/地图继承而不打算被其他任何人进一步扩展.它不是开源软件,它是我控制下的专有代码库,因此自由使用评论很好.如果要通过容器的整个界面,组合会有点痛苦.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读