Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1774304
  • 博文数量: 198
  • 博客积分: 4088
  • 博客等级: 上校
  • 技术积分: 2391
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-15 16:29
个人简介

游戏开发,系统架构; 博客迁移到:http://www.jianshu.com/u/3ac0504b3b8c

文章分类

全部博文(198)

文章存档

2017年(1)

2016年(12)

2015年(1)

2014年(3)

2013年(13)

2012年(18)

2011年(150)

分类: C/C++

2011-11-24 09:52:42

如果想让你的类不能使用copy构造函数和赋值操作符,只要将该类的copy构造函数和赋值操作符函数定义为private即可,并且只是声明,不用实现.
  1. class TestClass
  2. {
  3. public:
  4.     TestClass()
  5.         :X(0)
  6.     {
  7.     }
  8.     TestClass(int x)
  9.         :X(x)
  10.     {
  11.     }

  12.     ~TestClass(){}

  13.     void Show()
  14.     {
  15.         cout << "X = " << X << endl;
  16.     }

  17. private:
  18.     TestClass(const TestClass&);
  19.     TestClass& operator=(const TestClass&);

  20. private:
  21.     int X;
  22. };


  23. int main()
  24. {

  25.     TestClass t(3);
  26.     t.Show();

  27.     TestClass t1(t);
  28.     TestClass t2;
  29.     t2 = t;

  30.     return 0;
  31. }

编译错误为:

'TestClass::TestClass' : cannot access private member declared in class 'TestClass'

'TestClass::operator =' : cannot access private member declared in class 'TestClass'

这种方法的一点小缺陷是,如果该类的成员函数或其friend函数调用copy构造函数或赋值操作符函数,会将错误推后到连接期。有一种方法可以将连接期错误移至编译期。

先定义一个基类

  1. class UnCopyable
  2. {
  3. public:
  4.     UnCopyable();
  5.     ~UnCopyable();

  6. private:
  7.     UnCopyable(const UnCopyable&);
  8.     UnCopyable& operator=(const UnCopyable&);
  9. };

然后让你的类继承UnCopyable类

  1. class TestClass : public UnCopyable
  2. {
  3. public:
  4.     TestClass()
  5.         :X(0)
  6.         ,Y(0)
  7.     {
  8.     }

  9.     TestClass(int x, int y)
  10.         :X(x)
  11.         ,Y(y)
  12.     {
  13.     }

  14.     ~TestClass(){}

  15.     void Show()
  16.     {
  17.         cout << "X = " << X << ", Y = " << Y << endl;
  18.     }

  19. private:
  20.     int X;
  21.     int Y;

  22. };

其继承方式,不一定为 public,亦可为private

阅读(4126) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~