数据共享+指向自身类型的指针+智能指针

原创 2013年12月04日 23:24:19

实际项目遇到如下要求:

1、某几个类(A,B,C,....) 可以共享某个数据类;

2A,B,C,....这些类只使用数据类中感兴趣的数据成员;

3、只要数据类的数据更新, A,B,C,...类中相应的数据也可更新;

  

 

思考: 

1.继承、组合、指针都有数据分享的功能,但结合上述要求,选择指针实现;

2.指针:让多个指针指向数据类,实现数据的实时共享;

 

存在问题:多个指针指向一个类(目标),存在指针管理问题

 

涉及的C++知识:

1.指向自身类型的指针;

2.“智能指针思想,计数,增、减,零删除;

3.类静态成员和静态函数

  

程序代码:

//org.h
#ifndef _ORG_H
#define _ORG_H

#include<iostream>
#include<string>
using namespace  std;

class org
{
public:
	org();
	~org();

public://数据接口
	void set_name(string s);
	void set_number(int number);
	void set_grades(double grd);

	string get_name();
	int get_number();
	double get_grades();

private://数据
	string std_name;   //名字
	int    std_number; //学号
	double std_grades; //分数

public://关键
	static unsigned int InstanceRefNum;  //计数器
	static org* Instance;                //指向自身类型的指针
	static org* GetDef(void);            //增计数,内存分配,返回自指针
	static void DelDefault(void);        //撤销---减计数,删除
};

#endif
//org.cpp
#include "org.h"
org::org():std_name("xxx"),std_number(1),std_grades(0.1)
{ }
org::~org()
{ }

unsigned int org::InstanceRefNum = 0;  //计数初始化
org* org::Instance = NULL;             //自指针初始化

org* org::GetDef()
{
	++InstanceRefNum;               //计数
	if( Instance == NULL )
	{
            Instance = new org();      //初次时 内存分配
	}
	return  Instance;             //返回自指针
}


void org::DelDefault(void)
{
	--InstanceRefNum;              //撤销一次 减数
	if( InstanceRefNum == 0 && Instance != NULL)
	{
		delete Instance;                     //撤销到零 删除
		Instance = NULL;
		cout << "InstanceRefNum= " <<InstanceRefNum<<" all is over!"<<endl;
	}
}
void org::set_name(string s)
{
  std_name = s;
}
void org::set_number(int number)
{
  std_number = number;
}
void org::set_grades(double grd)
{ 
  std_grades = grd;
}
string org::get_name()
{
  return std_name;
}
int org::get_number()
{
  return std_number;
}
double org::get_grades()
{
  return std_grades;
}
//A.h
#ifndef _A_H
#define _A_H
#include<iostream>
#include<string>
#include "org.h"
using namespace  std;

class A
{
public:
	A();
	~A();
public:
//利用指向源数据类的指针 获取 数据
string get_name();
int get_number();
double get_grades();
private:
string std_name;
int    std_number;
double std_grades;
public:
   org* Aptr_org; //数据源类 指针

};
#endif
//A.cpp
#include "A.h"
A::A():std_name("xxx"),std_number(1),std_grades(0.1)
{
	Aptr_org=org::GetDef();  //对象创建  就得到数据源的自指针
}
A::~A()
{
	org::DelDefault();    //析构时,撤销
}
string A::get_name()
{   
	std_name = Aptr_org->get_name();  //利用指向源数据类的指针 获取 数据
	return std_name;
}
int A::get_number()
{
	std_number =Aptr_org->get_number();
	return std_number;
}
double A::get_grades()
{
	std_grades = Aptr_org->get_grades();
	return std_grades;
}


//B.h
#ifndef _B_H
#define _B_H
#include<iostream>
#include<string>
#include "org.h"
using namespace  std;
class B
{
public:
	B();
	~B();
public:
//利用指向源数据类的指针 获取 数据
string get_name();
int get_number();
double get_grades();
private:
string std_name;
int    std_number;
double std_grades;
public:
org* Bptr_org;
};
#endif
//B.cpp
#include "B.h"
B::B():std_name("xxx"),std_number(1),std_grades(0.1)
{
	Bptr_org=org::GetDef();
}
B::~B()
{
	org::DelDefault();
}
string B::get_name()
{   
	std_name = Bptr_org->get_name();
	return std_name;
}

int B::get_number()
{
	std_number =Bptr_org->get_number();
	return std_number;
}
double B::get_grades()
{
	std_grades = Bptr_org->get_grades();
	return std_grades;
}

//测试主程序
#include <iostream>
#include <string>


#include "org.h"
#include "A.h"
#include "B.h"

using namespace std;

int main()
{
  //原始数据
  org a;
  cout <<"name:"<<a.get_name()<<'\t'
	   <<"number:"<<a.get_number()<<'\t'
	  <<"grades:"<<a.get_grades()<<endl;


 //源数据 修改一次
  org *p;
  p = org::GetDef();
  p->set_name("张三");
  p->set_number(1001);
  p->set_grades(97.0);


  A sta;
  cout <<"name:"<<sta.get_name()<<'\t'
	  <<"number:"<<sta.get_number()<<'\t'
	  <<"grades:"<<sta.get_grades()<<endl;
  
  B stb;
  cout <<"name:"<<stb.get_name()<<'\t'
	  <<"number:"<<stb.get_number()<<'\t'
	  <<"grades:"<<stb.get_grades()<<endl;

//源数据 修改一次
  p->set_name("李四");
  p->set_number(1002);
  p->set_grades(67.0);

  cout <<"name:"<<sta.get_name()<<'\t'
	  <<"number:"<<sta.get_number()<<'\t'
	  <<"grades:"<<sta.get_grades()<<endl;

  cout <<"name:"<<stb.get_name()<<'\t'
	  <<"number:"<<stb.get_number()<<'\t'
	  <<"grades:"<<stb.get_grades()<<endl;


  org::DelDefault();

  return true;
}



结果:


相关文章推荐

编写一个智能指针类,自动记录SmartPointer<T*>对象的引用计数,一旦T类型对象的引用计数为零,就会释放对象

题目:《程序员面试金典 (第5版)》P

Item 45: 利用成员函数模板接受所有兼容类型(智能指针的部分实现)

真实指针做得很好的一件事是,它支持隐式转换,如下: class Top { ... }; class Middle: public Top{ ... }; class Botto...

关于C++中类型推导的说明

/* * 学习智能指针,及自动推导类型 */ #include "stdafx.h" #include #include #include // 用来测试类型:is_pointer是否是个指针...
  • wyansai
  • wyansai
  • 2016年02月24日 22:52
  • 201

cocos2dx 数据内存管理----RefPtr智能指针

对于所有的UI元素,用autorelease来管理,而对于游戏中的数据,每帧释放一次不适用,所以添加了RefPtr智能指针(模版类)来管理游戏中的数据类(需动态申请内存的数据) 简介...

【深入了解cocos2d-x 3.x】内置数据结构(1)——智能指针

智能指针在C++11的标准中已经存在了,分别是unique_ptr,shared_ptr,weak_ptr,其中最常用的应该是share_ptr,它采用引用计数的方式管理内存,当引用计数为0的时候,自...

C++11常用特性学习-类型安全(强类型枚举类/智能指针)

C98和C03对在构建复杂系统时已经可以胜任,并且在作用域、安全等方面已经可以满足现有的需求。C11增加的部分主要针对于程序员容易犯错误的部分进行优化,使其专心于C++项目本身而不是Cplusplus...

指向数组的智能指针scoped_array组件的使用

scoped_array与scoped_ptr基本是一对孪生兄弟,它包装了new[]操作符(而不是new)在堆上分配的动态数组,为动态数组提供了一个代理(Proxy),保存正确地释放内存。它弥补了标准...
  • ajioy
  • ajioy
  • 2012年03月14日 16:35
  • 7104

C++11 FAQ中文版:共享资源的智能指针——shared_ptr

三13 Year 2011陈 良乔C++11 FAQ 共享资源的智能指针——shared_ptr shared_ptr被用来表示共享的拥有权。也就是说,当两段代码都需要访问一些数据,而它们又都没有独...

多索引容器boost::multi_index_container储存共享智能指针boost::shared_ptr

本人也是搞游戏编程的.由客户端转向服务端近一年多来一直在从事服务器的开发. 拜读了本站一篇博文 [HengStar-Boost讲堂]多索引容器multi_index_container实战后我觉得有...

shared_ptr共享智能指针

原文地址: http://euyuil.com/2344/ 在最近的期中项目“牛奶”里,我大量运用了共享指针。虽然这是一种偷懒的表现,但是对于这个“模拟牛奶生产过程”的项目来说,我们并...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据共享+指向自身类型的指针+智能指针
举报原因:
原因补充:

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