美文网首页C++11我爱编程
C++实现用来继承的noncopyable类

C++实现用来继承的noncopyable类

作者: 哈莉_奎茵 | 来源:发表于2018-04-16 23:42 被阅读0次

在C++11中,如果想要禁止类的拷贝行为只需要把相应的函数设为delete即可,参见标准库的std::unique_ptr

unique_ptr (const unique_ptr&) = delete;
unique_ptr& operator= (const unique_ptr&) = delete;

而在之前的标准中是把相应的函数作为private函数。

然而,对于普通的类,如果不去查看类的成员函数声明,我们是无法知道该类是否为不可复制的类型。在C++中,利用继承的技巧可以简单实现noncopyable类。

class NonCopyable {
protected:
    NonCopyable(const NonCopyable&) = delete;
    NonCopyable& operator=(const NonCopyable&) = delete;

    NonCopyable() = default;
    ~NonCopyable() = default;
};

只需要继承该类就可以保证派生类不可复制

class A : public NonCopyable {};

int main() {
    A a1;
    A a2 = a1;  // 编译错误
    A a3;
    a3 = a1;  // 编译错误
    return 0;
}

这里利用到的是C++的合成构造函数,当派生类调用默认的构造函数/析构函数/拷贝构造函数/赋值运算符时,会先调用基类默认的构造函数/析构函数/拷贝构造函数/赋值运算符,而基类中拷贝构造函数和赋值运算符均不可用,所以派生类无法进行拷贝行为。同时,给NonCopyable类声明默认构造函数/析构函数,使得在派生类中能够调用基类(NonCopyable)的相应函数来构造/析构基类部分。

当然,如果需要的话,派生类也可以定义拷贝构造函数和赋值运算符,这种行为是允许的,但逻辑上产生了矛盾,属于程序员的失误。

class A : private NonCopyable {
public:
    A(int i) : i_(i) {}
    A(const A& rhs) : i_(rhs.i_) {}
    A& operator=(const A& rhs) { i_ = rhs.i_; return *this; }

    void show() { cout << i_ << endl;}
private:
    int i_;
};

int main() {
    A a1(3);
    A a2 = a1;  // OK
    a2 = a1;  // OK
    a2.show();
    return 0;
}

参考boost::noncopyable的实现

相关文章

  • C++实现用来继承的noncopyable类

    在C++11中,如果想要禁止类的拷贝行为只需要把相应的函数设为delete即可,参见标准库的std::unique...

  • UML图笔记

    一、泛化: 泛化 C++实现方式:类继承 二、实现 C++实现方式:类继承,且实现了父类的接口。 三、关联 单向关...

  • typeScripte 中 extends 和implement

    extends用来继承类,implements用来实现一个接口 extends案例

  • Java Enum的七种用法

    枚举 枚举是由class来实现的(继承Enum类,所以不能再继承其他类,也不能被继承,但是可用来实现接口)。因此由...

  • Java面向对象 基础知识(二)

    继承的实现:继承是用来扩展父类的功能,用extend关键字来完成继承格式:class 子类 extends 父类 ...

  • 继承与派生

    1,父类与子类,单继承与多继承 2、为何要用继承:用来解决类与类之间代码冗余问题 3,如何实现继承 4,属性查找 ...

  • 技能

    C++ C++特性 C++11 多态和继承 构造函数 析构函数 手写代码实现string类 手写代码实现智能指针 ...

  • [C++之旅] 18 公有继承、保护继承和私有继承

    [C++之旅] 18 公有继承、保护继承和私有继承 继承 继承的类称为派生类或子类,被继承的类称为基类或父类。继承...

  • QmlTableView

    使用QtQuick的MVC模式新建c++类继承于QAbstractTableModel, 并实现几个重要方法: C...

  • 继承(Inheritance)

    当子类继承基类时,子类包含了父基类所有数据及操作的定义。 在 C++ 实践中,继承主要用于两种场合: 实现继承:子...

网友评论

    本文标题:C++实现用来继承的noncopyable类

    本文链接:https://www.haomeiwen.com/subject/toyykftx.html