《C++沉思录》将计数器和对象分离开

原创 2006年06月15日 09:45:00

class point
{
public:
 point(int x = 0, int y = 0) : xval(x), yval(y) { }
 int x(void) const { return xval; }
 int y(void) const { return yval; }
 point &x(int xv) { xval = xv; return *this; }
 point &y(int yv) { yval = yv; return *this; }
private:
 int xval, yval;
};

class useCount
{
public:
 useCount(void) : p(new int(1)) { }
 useCount(const useCount& u) : p(u.p) { ++*p; }
 useCount& operator=(const useCount&);
 
 bool Only(void) { return *p == 1; }
 bool reattach(const useCount &u)
 {
  ++*u.p;
  if (--*p == 0)
  {
   delete p;
   p = u.p;
   return true;
  }
  p = u.p;
  return false;
 }
 bool makeOnly(void)
 {
  if (*p == 1)
  {
   return false;
  }
  --*p;
  p = new int(1);
  return true;
 }

 ~useCount(void)
 {
  if (--*p == 0)
  {
   delete p;
  }
 }
private:
 int *p;
};


class Handle
{
public:
 Handle(void) : up(new point) { }
 Handle(int x,int y) : up(new point(x, y)) { }
 Handle(const point& p) : up(new point(p)) {}
 Handle(const Handle& h) :up(h.up), u(h.u){}
 Handle& operator=(const Handle &h)
 {
  if (u.reattach(h.u))
  {
   delete up;
  }
  up = h.up;
  return *this;
 }

 int x(void) const
 {
  return up->x();
 }
 Handle& x(int x0)
 {
  if (u.makeOnly())
  {
   up = new point(*up);
  }
  
  up->x(x0);
  return *this;
 }
 ~Handle(void)
 {
  if (u.Only())
  {
   delete up;
  }
 }

private:
 point *up;
 useCount u;
};

相关文章推荐

C++沉思录读书笔记(29章)- 应用器,操纵器和函数对象

我们经常在程序中看见诸如int n; cout 对于cout ostream& operator

c++沉思录笔记(21章代码)浅谈函数对象

标准库中有一个函数  find_if (#include )接受一对输入迭代器和一个谓词函数作为参数。 例如有一谓词函数如下: bool greater100(int n) { return...

函数对象-摘自《C++沉思录》Andrew Koenig

函数对象提供了一种方法,将要调用的
  • locklzg
  • locklzg
  • 2014年07月21日 10:51
  • 478

C++沉思录 第八章 面向对象程序范例

c++沉思录第八章的示例程序很有意思。程序虽小,却很好地诠释了面向对象编程的思想。 正如书上说的仔细研究还是有所收获的。先上代码codeExpr_node.h#pragma once #includ...

《C++沉思录》——面向对象

面向对象——数据抽象、继承、动态绑定(规模大、方便修改)

C++沉思录第八章算数表达式树的面向对象问题的分析

刚开始看沉思录,觉得太枯燥。到了第八章,作者关于面向对象问题的分析,我follow书上的设计开发,理解了一些以前只是在书上看到的概念。 给自己做几点注解吧: 1.虚基类用来表达所有的继承类的共有特点,...

一个面向对象程序范例-摘自《C++沉思录》Andrew Koenig

通常认为,面向对象编程有3个要素:数据抽象、继承以及
  • locklzg
  • locklzg
  • 2014年06月10日 15:34
  • 480

C++沉思录读书笔记(8章)-一个面向对象程序范例1

这个例子很好的展示了面向对象编程的三个要素:数据抽象、继承和动态绑定。 问题:算术表达式的表达式树, 如(-5)*(3+4)对应的表达式树为: 我们希望通过调用合适的函数来创建这样的树...

c++沉思录笔记(21章代码)通过函数对象解决c++的函数嵌套问题

在c++中,如果企图将函数作为参数进行传递的话,都会被立即转换为指向函数的指针。 看一个例子,假设我们有一对函数 f 和 g int f (int); int g (int); 我们希望能够使用下...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《C++沉思录》将计数器和对象分离开
举报原因:
原因补充:

(最多只允许输入30个字)