基于策略的类中的策略转换运算符与私有析构函数

Modern C++ Design: Generic Programming and Design Patterns AppliedAndrei Alexandrescu中,主张保护政策的破坏者的主张是:

由于析构函数受到保护,因此只有派生类才能销毁策略对象,因此外部人员无法将delete应用于策略类的指针。但是,析构函数不是虚拟的,因此没有大小或速度开销

但是后来,他写了以下有关策略兼容性的段落:

如您所见,在实现策略之间的转换时,您具有双向灵活性。您可以在左侧实现转换构造函数,也可以在右侧实现转换运算符。

假设我们有2条政策:

class First{
public:
  First()             = default;
  First(const First&) = default;

protected:
  ~First() = default;
};

class Second{
public:

  explicit operator First() const {
    return //what???
  }

  Second()              = default;
  Second(const Second&) = default;
  Second(const First& )   {};

protected:
  ~Second() = default;
};

如何在不构造类型为First的临时对象的情况下创建从策略第二到策略第一的转换运算符?

TemplateRex

问题在于,除了派生类之外,您无法创建具有受保护析构函数的对象。因此,禁止创建此类临时工的转换操作员。解决该问题的一种方法是通过构造函数进行建立FirstSecond接受explicit

#include <iostream>

class First;
class Second;

class First
{
public:
    First()             = default;
    First(const First&) = default;
    explicit First(const Second&); 
    int value() const { return x; }    
protected:
    ~First() = default;
private:
    int x = 1;
};

class Second
{
public:
    Second()              = default;
    Second(const Second&) = default;
    explicit Second(const First&);
    int value() const { return x; }
protected:
    ~Second() = default;
private:
    int x = 2;
};

First::First(const Second& s): x(s.value()) {}
Second::Second(const First& f): x(f.value()) {}

然后,您可以创建一个Host<Policy>具有模板化转换构造函数的主机类模板,该转换构造函数可以转换策略Policy和任意U

template<class Policy>
class Host
: 
    public Policy
{
public:    
    Host() = default;

    template<class U>
    Host(Host<U> const& other)
    :
        Policy(other)
    {}
};

int main()
{
    Host<First> h1;
    Host<Second> h2;
    Host<Second> h3(h1);
    Host<First> h4(h2);

    std::cout << h1.value() << "\n";
    std::cout << h2.value() << "\n";
    std::cout << h3.value() << "\n";
    std::cout << h4.value() << "\n";
}

现场例子

请注意,确实建议使用受保护的析构函数和公共继承,但特别建议您安全使用“丰富的”(即有状态)策略。对于无状态策略,还可以使用受保护的继承和公共析构函数。对于这些策略,转换运算符可以生成临时文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

何时使用:类析构函数或删除运算符

来自分类Dev

类析构函数导致重载+运算符的问题

来自分类Dev

取消运算符delete []中的析构函数调用

来自分类Dev

在派生类中定义析构函数需要复制赋值运算符

来自分类Dev

在赋值运算符之前调用的结构的析构函数

来自分类Dev

从赋值运算符调用析构函数是否有任何意外的后果?

来自分类Dev

具有虚拟和非虚拟析构函数的删除运算符的不同行为

来自分类Dev

来自libc ++的istringstream析构函数中对运算符delete的未定义引用

来自分类Dev

如何在移动分配运算符中调用析构函数?

来自分类Dev

具有复制构造函数,平凡的赋值运算符和平凡的析构函数的动态大小的文本对象

来自分类Dev

复制构造函数,赋值运算符和析构函数代码重复

来自分类Dev

如果我还使用复制构造函数和重载=运算符,是否需要析构函数?

来自分类Dev

std :: swap在构造函数,赋值运算符和析构函数方面如何工作?

来自分类Dev

复制构造函数的析构函数和赋值运算符,以用于存储指向另一个类的指针的类

来自分类Dev

C ++是否为纯虚拟类创建默认的“构造函数/析构函数/复制构造函数/复制赋值运算符”?

来自分类Dev

C ++是否为纯虚拟类创建默认的“构造函数/析构函数/复制构造函数/复制赋值运算符”?

来自分类Dev

重载delete []运算符,以允许使用析构函数缩小类型的数组

来自分类Dev

如何允许std :: unique_ptr访问类的私有析构函数或使用私有析构函数实现C ++工厂类?

来自分类Dev

R参考类中是否有析构函数?

来自分类Dev

运算符<<无法访问类的私有int

来自分类Dev

确定C ++类是否具有私有析构函数

来自分类Dev

在类中重载运算符并返回对私有值的引用

来自分类Dev

为什么在Singleton类中使用私有析构函数?

来自分类Dev

为什么在Singleton类中使用私有析构函数?

来自分类Dev

使用shared_ptr时需要实现析构函数,复制构造函数,赋值运算符

来自分类Dev

多态类中的虚拟析构函数

来自分类Dev

类中std :: vector的析构函数

来自分类Dev

析构函数中的动态转换

来自分类Dev

继承中的此运算符和私有变量

Related 相关文章

  1. 1

    何时使用:类析构函数或删除运算符

  2. 2

    类析构函数导致重载+运算符的问题

  3. 3

    取消运算符delete []中的析构函数调用

  4. 4

    在派生类中定义析构函数需要复制赋值运算符

  5. 5

    在赋值运算符之前调用的结构的析构函数

  6. 6

    从赋值运算符调用析构函数是否有任何意外的后果?

  7. 7

    具有虚拟和非虚拟析构函数的删除运算符的不同行为

  8. 8

    来自libc ++的istringstream析构函数中对运算符delete的未定义引用

  9. 9

    如何在移动分配运算符中调用析构函数?

  10. 10

    具有复制构造函数,平凡的赋值运算符和平凡的析构函数的动态大小的文本对象

  11. 11

    复制构造函数,赋值运算符和析构函数代码重复

  12. 12

    如果我还使用复制构造函数和重载=运算符,是否需要析构函数?

  13. 13

    std :: swap在构造函数,赋值运算符和析构函数方面如何工作?

  14. 14

    复制构造函数的析构函数和赋值运算符,以用于存储指向另一个类的指针的类

  15. 15

    C ++是否为纯虚拟类创建默认的“构造函数/析构函数/复制构造函数/复制赋值运算符”?

  16. 16

    C ++是否为纯虚拟类创建默认的“构造函数/析构函数/复制构造函数/复制赋值运算符”?

  17. 17

    重载delete []运算符,以允许使用析构函数缩小类型的数组

  18. 18

    如何允许std :: unique_ptr访问类的私有析构函数或使用私有析构函数实现C ++工厂类?

  19. 19

    R参考类中是否有析构函数?

  20. 20

    运算符<<无法访问类的私有int

  21. 21

    确定C ++类是否具有私有析构函数

  22. 22

    在类中重载运算符并返回对私有值的引用

  23. 23

    为什么在Singleton类中使用私有析构函数?

  24. 24

    为什么在Singleton类中使用私有析构函数?

  25. 25

    使用shared_ptr时需要实现析构函数,复制构造函数,赋值运算符

  26. 26

    多态类中的虚拟析构函数

  27. 27

    类中std :: vector的析构函数

  28. 28

    析构函数中的动态转换

  29. 29

    继承中的此运算符和私有变量

热门标签

归档