boost的noncopyable允许创建一个禁止复制的类,使用很简单,但很好用!

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
 
/* boost_noncopyable.cpp 创建一个禁止复制的类
    noncopyable允许程序轻松实现一个禁止复制的类;
*/

#include <iostream>
#include <boost/noncopyable.hpp> // 或#include <boost/utility.hpp>

using namespace std;
using namespace boost;

//在C++中定义一个类的时候,如果不明确定义拷贝构造函数和拷贝复制操作符,编译器会为我们自动生成
//但有时候我们不需要类的复制语义,希望禁止复制类的实例
//这是一个很经典的C++惯用语法,只要私有化拷贝构造函数和拷贝赋值操作函数即可
//如果程序中有大量这样的类,重复写这样的代码是相当乏味的,而且代码出现的次数越多越容易增加手写出错的几率
class empty_class
{
public:
    empty_class() {}
    ~empty_class() {}

//编译器默认添加拷贝构造函数和拷贝赋值函数
    empty_class(const empty_class & ) {}
    empty_class &operator=(const empty_class &) {}
protected:
private:
};

class noncopy_class
{
public:
    noncopy_class() {}
    ~noncopy_class() {}
protected:
private:
    //私有化拷贝构造函数和拷贝赋值函数,禁止复制类
    noncopy_class(const noncopy_class & ) {}
    noncopy_class &operator=(const noncopy_class &) {}
};

//针对以上情况,boost中的noncopyable为实现不可拷贝类提供了简单清晰的解决方案
//从boost::noncopyable派生即可
/*
class noncopyable
{
protected:
#if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && !defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS)
    BOOST_CONSTEXPR noncopyable() = default;
    ~noncopyable() = default;
#else
    noncopyable() {}
    ~noncopyable() {}
#endif
#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)
    noncopyable( const noncopyable& ) = delete;
    noncopyable& operator=( const noncopyable& ) = delete;
#else
private:  // emphasize the following members are private
    noncopyable( const noncopyable& );
    noncopyable& operator=( const noncopyable& );
#endif
};
}

typedef noncopyable_::noncopyable noncopyable;
*/
class do_not_copy_class : noncopyable
{
public:
protected:
private:
};

int main(void)
{
    empty_class em_c1;
    empty_class em_c2(em_c1);
    empty_class em_c3 = em_c1;

noncopy_class noc_c1;
    //error C2248: 'noncopy_class::noncopy_class' : cannot access private member declared in class 'noncopy_class'
    //noncopy_class noc_c2(noc_c1) ;
    //noncopy_class noc_c3 = noc_c1;

do_not_copy_class d1;
    //error C2248: 'boost::noncopyable_::noncopyable::noncopyable' : cannot access private member declared in class 'boost::noncopyable_::noncopyable'
    //do_not_copy_class d2(d1);
    //do_not_copy_class d3 = d1;

//只要有可能就使用boost::noncopyable,它明确无误地表达了类设计者的意图;
    //对用户更加友好,而且与其它的boost库配合的也好
    cin.get();
    ;
}

boost实用工具:创建一个禁止复制的类 noncopyable的更多相关文章

  1. C++ 之Boost 实用工具类及简单使用

    本文将介绍几个 Boost 实用工具类,包括 tuple.static_assert.pool.random 和 program_options等等.需要对标准 STL 具备一定的了解才能充分理解本文 ...

  2. 使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字“Hello Android”,并将应用程序的名称更改为“FirstApp”。

    需求说明: 使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字"Hello Android",并将应用程序的名称更改为"Firs ...

  3. 使用 Android Studio 开发工具创建一个 Android 应用程序,并在 Genymotion 模拟器上运行

    需求说明: 使用 Android Studio 开发工具创建一个 Android 应用程序,并在 Genymotion 模拟器上运行 实现步骤: 打开 Android Studio,创建一个 Andr ...

  4. 创建一个自定义的Application类

    由于每个应用程序必须创建一个Application对象,vs为开发人员提供了模板来减轻开发人员的重复工作.当使用vs创建一个WPF应用程序是,vs会自动创建一个app.xaml文件, <Appl ...

  5. 3dmax使用K帧工具创建一个行走动作

    第一步,创建一个biped骨骼. 这个就不截图了,因为基本都会. 记住一点,先改变了关键点再去修改,不然修改的是前一个关键帧的动作. 第二步,开启自动关键帧,然后给初始位置双脚添加踩踏关键点.设置关键 ...

  6. 怎用不用工具创建一个javaWeb项目

    整体步骤是: 1: 新建一个文件夹:  以项目名称命名 2:在新建的文件夹下再新建一个文件夹 WEB-INF  (注意:大小写) 和 一个文件  index.jsp : index.jsp里面的代码: ...

  7. 创建一个抽象的员工类, 抽象开发累继承员工类,JavaEE ,和安卓继承开发类在测试类中进行测试

    /* 1 定义一个员工类  所有的子类都抽取(抽象类)  Employee            属性:姓名  工号(生成get  set  )       方法:工作  抽象     2 定义一个研 ...

  8. Android 性能优化(16)线程优化:Creating a Manager for Multiple Threads 如何创建一个线程池管理类

    Creating a Manager for Multiple Threads 1.You should also read Processes and Threads The previous le ...

  9. boost实用工具:typeof库 BOOST_TYPE BOOST_AUTO

    boost::typeof库中使用宏BOOST_TYPE和BOOST_AUTO来模拟C++11关键字typeof和auto  C++ Code  123456789101112131415161718 ...

随机推荐

  1. sql各种连接详解

      迁移时间:2017年6月1日16:33:58 CreateTime--2016年9月14日11:19:00Author:Marydon sql各种连接详解 参考链接: http://www.jb5 ...

  2. 多语言 SEO

    https://productforums.google.com/forum/?hl=zh-CN#!topic/webmaster-zh-cn/I0MMsm737pc

  3. 利用pandas进行数据分析之二:DataFrame与Series数据结构对比

    Series与DataFrame对比学习 文章为本人原创,未经同意请勿转载,http://www.cnblogs.com/smallcrystal/ Series:构建的方法,一组数组(列表或元组), ...

  4. WPF 流文档

    WPF文本显示: WPF面向的是UI展现,而文本显示无疑是UI层中的重要功能之中的一个.WPF提供了XPS (XML 文件规范) 和Flow Document (流文档) 来在不同的场景下展现或者操作 ...

  5. Lintcode---克隆二叉树

    深度复制一个二叉树. 给定一个二叉树,返回一个他的 克隆品 . 您在真实的面试中是否遇到过这个题? Yes 样例 给定一个二叉树: 1 / \ 2 3 / \ 4 5 返回其相同结构相同数值的克隆二叉 ...

  6. NPM 模块收集

    cross-env https://www.npmjs.com/package/cross-env 在package.json设置环境变量的时候,会有兼容性问题,如: { "scripts& ...

  7. C++代码优化方法总结

    C++代码优化方法总结 优化是一个非常大的主题,本文并不是去深入探讨性能分析理论,算法的效率,况且我也没有这个能力.我只是想把一些可以简单的应用到你的C++代码中 的优化技术总结在这里,这样,当你遇到 ...

  8. GNU C编译器的gnu11和c11

    国际标准组织发布c11后,gnu为自己的编译器发布两种标准gnu11和c11 gnu11:带gnu c扩展的c11标准,如果你的代码包含了typeof,__attribute__等等gnu的扩展,就必 ...

  9. atitit..sql update语法的词法分析,与语法ast构建

    atitit..sql update语法的词法分析,与语法ast构建 1. 要使用sql udpate语法的dsl ,需要写个解释器.. 1 2. 词法分析的实现 1 2.1. 扫描器的实现 SqlU ...

  10. java synchronized究竟锁住的是什么

    刚学java的时候,仅仅知道synchronized一个线程锁.能够锁住代码,可是它真的能像我想的那样,能够锁住代码吗? 在讨论之前先看一下项目中常见关于synchronized的使用方法: publ ...