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

原创 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;
}



结果:


C/C++知识要点5——智能指针原理及自定义实现

智能指针概述: 智能指针用来管理动态对象。其行为类似于常规指针,重要的区别是:它负责自动释放所指向的对象。 C++ 11标准库提供两种智能指针:shared_ptr、unique_ptr 区别是...
  • TommyZht
  • TommyZht
  • 2015年08月10日 10:51
  • 1431

为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?

从对象构造的角度理解“数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用”...
  • playboy_lei
  • playboy_lei
  • 2016年07月26日 21:57
  • 2223

shared_ptr 共享指针 智能指针 简介

原文地址: http://euyuil.com/2344/ http://www.cnblogs.com/welkinwalker/archive/2011/10/20/2218804.htm...
  • u011866460
  • u011866460
  • 2014年12月19日 13:54
  • 1397

C++文本查询程序 定义类管理数据 用引用共享数据 不用智能指针 C++Primer练习12.27

//TextQuery.h文件ifndef TEXTQUERY_Hdefine TEXTQUERY_Hincludeincludeincludeincludeincludeincludeinclude...
  • Jeff_Winger
  • Jeff_Winger
  • 2018年01月04日 23:43
  • 32

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

题目:《程序员面试金典 (第5版)》P
  • bupt8846
  • bupt8846
  • 2014年11月20日 23:17
  • 455

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

真实指针做得很好的一件事是,它支持隐式转换,如下: class Top { ... }; class Middle: public Top{ ... }; class Botto...
  • forlove_you
  • forlove_you
  • 2017年03月28日 19:05
  • 115

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

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

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

智能指针在C++11的标准中已经存在了,分别是unique_ptr,shared_ptr,weak_ptr,其中最常用的应该是share_ptr,它采用引用计数的方式管理内存,当引用计数为0的时候,自...
  • baijiajie2012
  • baijiajie2012
  • 2015年03月28日 12:00
  • 1073

数据结构--重构智能指针SmartPointer

思考一个问题,能否使用智能指针(SmartPointer)替换单链表(LinkList)中的原生指针?经过尝试发现替换后的单链表在遍历数据时程序直接爆掉,那么问题出在哪里? 首先回忆一下SmartPo...
  • tqs_1220
  • tqs_1220
  • 2017年12月24日 12:54
  • 64

数据结构--另一种智能指针-SharedPointer

上一篇讲了最多只能由一个指针标识堆空间的SmartPointer,本篇讲解另一种智能指针--SharedPointer。 设计要点: 使用类模板实现。 继承自Pointer类 通过计数机制(r...
  • tqs_1220
  • tqs_1220
  • 2017年12月24日 15:53
  • 37
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据共享+指向自身类型的指针+智能指针
举报原因:
原因补充:

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