Explicitly disallow the use of complier-generated functions you do not want
但这个做法并没有那么完美,因为member函数还有friend函数还是可以调用private函数。看下面的代码:
唯一的办法就是根本就不实现它,让编译器链接时直接抱怨有错误。在boost类库中提供了一个阻止这些情况的类型用来给予开发人员使用。大致形如这样的设计:
这行得通,因为只要任何人――甚至是 member函数或 friend函数――尝试拷贝 X 对象,编译器便试着生成一个 copy构造函数和一个 copy assignment操作符,这些函数的“编译器生成版“会尝试调用其 base class的对应兄弟,那些调用会被编译器拒绝,因为其 base class的拷贝函数是 private。
上一条款我们已经知道,编译器会自动给我生成一些函数,那么当我们不希望class产生提供的方法,只要不声明对应函数就是了,但这个策略在对copy构造函数和copy assignment操作符时却不起作用,因为编译器会帮我们声明它们,解决的方法就是将它们声明为private,人为的组织它们被调用。
- class X {
- public:
- X() { }
- private:
- X(const X& rhs) { }
- X& operator=(const X& rhs) {
- X x;
- return x;
- }
- };
但这个做法并没有那么完美,因为member函数还有friend函数还是可以调用private函数。看下面的代码:
- class X {
- public:
- X() { }
- private:
- X(const X& rhs) { }
- X& operator=(const X& rhs) {
- X x;
- return x;
- }
- friend void print(void);
- };
- void print(void) {
- X x;
- X x2 = x;
- };
唯一的办法就是根本就不实现它,让编译器链接时直接抱怨有错误。在boost类库中提供了一个阻止这些情况的类型用来给予开发人员使用。大致形如这样的设计:
- #include "stdafx.h"
- #include <stdlib.h>
- class noncopyable {
- protected:
- noncopyable() { }
- ~noncopyable() { }
- private:
- noncopyable(const noncopyable&);
- noncopyable& operator=(const noncopyable&);
- };
- class X : private noncopyable { class 不在声明
- ///copy 构造函数或copy assign 操作符
- };
- int _tmain(int argc, _TCHAR* argv[]) {
- X x;
- X x2 = x;
- system("pause");
- return 0;
- }
这行得通,因为只要任何人――甚至是 member函数或 friend函数――尝试拷贝 X 对象,编译器便试着生成一个 copy构造函数和一个 copy assignment操作符,这些函数的“编译器生成版“会尝试调用其 base class的对应兄弟,那些调用会被编译器拒绝,因为其 base class的拷贝函数是 private。
请记住:
为驳回编译器自动(暗自)提供的机能,可以将相应的成员函数声明为private并且不予实现。使用像Uncopyable这样的base class也是一种做法。