/ #include "pch.h" #include <functional> #include <iostream> #include <list> #include <map> class NonCopyable { protected: NonCopyable() = default; ~NonCopyable() = default; NonCopyable(const NonCopyable &) = delete; NonCopyable operator=(const NonCopyable&) = delete; }; template<typename F> class Events : public NonCopyable { public: Events() {} ~Events() {} // 注册观察者,支持右值引用 int Connect
在本次代码实现中,我们不希望新增的事件类型能够进行复制,因此,在实现时将会用=default和=delete标识符对类的特殊函数进行限制,改进后的观察者模式代码如下: class NonCopyable { protected: NonCopyable()=default; ~NonCopyable()=default; NonCopyable(const NonCopyable &)=delete; NonCopyable & operator =(const NonCopyable &) = delete; }; template <typename Func> class Event:NonCopyable{ public: Event()=default; ~Event()=delete; //注册观察者,支持右值引用 int
include <thread> #include <memory> #include <pthread.h> #include <semaphore.h> #include <atomic> struct Noncopyable { Noncopyable() = default; ~Noncopyable() = default; Noncopyable(const Noncopyable&) = delete; Noncopyable & operator=(const Noncopyable&) = delete; }; /** * brief: 信号量 */class Semaphore : Noncopyable { public m_lock = false; } } private: T& m_mutex; bool m_lock = false; }; /** * brief: 互斥量 */ class Mutex : Noncopyable pthread_rwlock_unlock(&m_lock); } private: pthread_rwlock_t m_lock; }; /** * brief: 自旋锁 */ class SpinLock : Noncopyable
比如说int,C++中的内置类型都是值语义,前面学过的三个标准库类型string,vector,map也是值语义 2、对象语义指的是面向对象意义下的对象 对象拷贝是禁止的(Noncopyable) NonCopyable() {} ~NonCopyable() {} private: NonCopyable(const NonCopyable &); const NonCopyable &operator=(const NonCopyable &); }; //抽象类,对象语义,禁止拷贝(首先需要拷贝NonCopyable) class Node : private NonCopyable { public: virtual double Calc() const = 0; virtual ~Node(void) {} }; 注意NonCopyable 同样地,NonCopyable类的拷贝构造函数和赋值运算符为私有,故如 AddNode ad2(ad1); 编译出错。
default; // 强制生成拷贝构造函数 MyClass(MyClass&&) = default; // 强制生成移动构造函数 }; (2) 禁用特定函数 class NonCopyable { public: NonCopyable() = default; NonCopyable(const NonCopyable&) = delete; // 禁止拷贝 NonCopyable & operator=(const NonCopyable&) = delete; }; V.
NonCopyable() {} ~NonCopyable() {} private: NonCopyable(const NonCopyable &); const NonCopyable &operator=(const NonCopyable &); }; //抽象类,对象语义,禁止拷贝(首先需要拷贝NonCopyable) class Node : private NonCopyable { public: virtual double Calc() const = 0; virtual ~Node(void) {} }; 注意NonCopyable 类的构造函数声明为protected,则不能直接构造对象,如NonCopyable nc; // error 但在构造派生类,如最底层的AddNode类时,可以被间接调用。 同样地,NonCopyable类的拷贝构造函数和赋值运算符为私有,故如 AddNode ad2(ad1); 编译出错。
以下是一个禁止类拷贝操作的示例:#include <iostream>class NonCopyable {public: // 默认构造函数 NonCopyable() = default ; // 拷贝构造函数,禁止拷贝 NonCopyable(const NonCopyable&) = delete; // 拷贝赋值运算符,禁止拷贝赋值 NonCopyable& operator=(const NonCopyable&) = delete; // 析构函数 ~NonCopyable() = default; int data;};int main () { NonCopyable obj1; obj1.data = 10; // 以下代码会导致编译错误,因为拷贝构造函数被删除 // NonCopyable obj2(obj1 “=delete;”显式地删除了拷贝构造函数和拷贝赋值运算符,这样就禁止了NonCopyable类的对象被拷贝。
template<typename T> class ThreadLocal : boost::noncopyable ? muduo/base/ThreadLocal.h> #include <muduo/base/Thread.h> #include <boost/bind.hpp> #include <boost/noncopyable.hpp > #include <stdio.h> class Test : boost::noncopyable { public: Test() { printf("tid= debug/bin$ 二、ThreadLocalSingleton<T>类 template<typename T> class ThreadLocalSingleton : boost::noncopyable > #include <stdio.h> class Test : boost::noncopyable { public: Test() { printf("tid=
class NonCopyable { public: // 删除拷贝构造函数 NonCopyable(const NonCopyable&) = delete; // 删除拷贝赋值运算符 NonCopyable& operator=(const NonCopyable&) = delete; }; 在上述例子中,NonCopyable 类不允许被复制,因为拷贝构造函数和拷贝赋值运算符被删除
,4(外框) 消费者: 信号量+互斥锁:1,2,3,4 条件变量+互斥锁:2,1,3,4(外框) template<typename T> class BlockingQueue : boost::noncopyable template<typename T> class BoundedBlockingQueue : boost::noncopyable ? class ThreadPool : boost::noncopyable typedef boost::function<void ()> Task; ? >重载了[], 即 T& operator[]( size_type n ); 三、singleton类 template<typename T> class Singleton : boost::noncopyable
C++11里面可以用default来指定使用默认的构造函数,而且可以通过delete来显式地禁止一些方法,如复制构造函数和复制赋值操作,如下例: struct NonCopyable{ NonCopyable () = default; NonCopyable(const NonCopyable&) = delete; NonCopyable& operator=(const NonCopyable&)
一、MutexLock 类 class MutexLock : boost::noncopyable 二、MutexLockGuard类 class MutexLockGuard : boost::noncopyable 三、Condition类 class Condition : boost::noncopyable 某个线程: 加锁 得到通知返回前重新加锁 解锁 另一个线程: 加锁 更改条件 通知notify(可以移到锁外) 解锁 四、CountDownLatch类 class CountDownLatch : boost::noncopyable
比如说int,C++中的内置类型都是值语义,前面学过的三个标准库类型string,vector,map也是值语义 2、对象语义指的是面向对象意义下的对象 对象拷贝是禁止的(Noncopyable) NonCopyable() {} ~NonCopyable() {} private: NonCopyable( const NonCopyable &); const NonCopyable & operator=( const NonCopyable &); }; //抽象类,对象语义,禁止拷贝(首先需要拷贝NonCopyable) class Node : ; 注意NonCopyable 类的构造函数声明为protected,则不能直接构造对象,如NonCopyable nc; // error 但在构造派生类,如最底层的AddNode类时,可以被间接调用 同样地,NonCopyable类的拷贝构造函数和赋值运算符为私有,故如 AddNode ad2(ad1); 编译出错。
1.3 实现方式 #include <iostream> class NonCopyable { public: NonCopyable() { std::cout << "Constructor called" << std::endl; } ~NonCopyable() { std::cout << "Destructor called" << std::endl ; } // 禁止拷贝构造 NonCopyable(const NonCopyable&) = delete; // 禁止拷贝赋值 NonCopyable& operator =(const NonCopyable&) = delete; }; int main() { NonCopyable obj1; // 正常创建对象 // NonCopyable
一、MutexLock 类 class MutexLock : boost::noncopyable ? 二、MutexLockGuard类 class MutexLockGuard : boost::noncopyable ? 三、Condition类 class Condition : boost::noncopyable ? 得到通知返回前重新加锁 解锁 另一个线程: 加锁 更改条件 通知notify(可以移到锁外) 解锁 四、CountDownLatch类 class CountDownLatch : boost::noncopyable
noncopyable禁止拷贝 1.通用的做法是写一个类noncopyable,凡是继承该类的任何类都无法复制和赋值。 #include <bits/stdc++.h> using namespace std; class noncopyable { protected: noncopyable() = default ; ~noncopyable() = default; private: noncopyable(const noncopyable&) = delete; const noncopyable & operator=( const noncopyable& ) = delete; }; class StockFactory:noncopyable{ public: StockFactory ()=default; ~noncopyable()=default; noncopyable(const noncopyable &)=delete; noncopyable
return 0; } 六、复制构造函数的高级特性 6.1 防止对象复制:删除复制构造函数 通过将复制构造函数声明为delete,可以禁止对象的复制(C++11 及以后): class NonCopyable { public: NonCopyable() = default; NonCopyable(const NonCopyable&) = delete; // 禁止复制构造 NonCopyable & operator=(const NonCopyable&) = delete; // 禁止拷贝赋值 }; int main() { NonCopyable obj1; NonCopyable
与C++98方式的对比 C++98做法: class NonCopyable { private: NonCopyable(const NonCopyable&); // 只声明不实现 NonCopyable& operator=(const NonCopyable&); }; 这种方式的缺点: 需要在链接阶段才能发现错误 语法不够直观 需要将函数声明为private C++11做法: class NonCopyable { public: NonCopyable(const NonCopyable&) = delete; NonCopyable& operator= (const NonCopyable&) = delete; }; 优点: 编译时就能发现错误 语法更清晰直观 可以应用于任何函数(包括普通成员函数) 典型应用场景 禁止拷贝: class UniqueResource
template<int SIZE> class FixedBuffer : boost::noncopyable ? class LogStream : boost::noncopyable { typedef LogStream self; public: class Fmt // : boost::noncopyable { public: template<typename T> Fmt(const char* fmt, T val 一个典型的日志文件名 logfile_test.20130411-115604.popo.7743.log // 运行程序.时间.主机名.线程名.log class LogFile : boost::noncopyable * kRollPerSeconds_; 表示start对齐到kR的整数倍,也就是时间调整到当天零时 // not thread safe class LogFile::File : boost::noncopyable
queue> #include <thread> template<typename T> class __attribute__((unused)) WorkStealingQueue : boost::noncopyable SBasic/Operator.h" template<typename T> class __attribute__((unused)) AtomicPriorityQueue : boost::noncopyable condition_variable> template<typename T> class __attribute__((unused)) AtomicRingBufferQueue : boost::noncopyable TaskFlow\SBasic\TypeConver.hpp" template<typename T> class __attribute__((unused)) RunningThread : boost::noncopyable include <condition_variable> template<typename T> class __attribute__((unused)) AtomicQueue : boost::noncopyable