类管理指针成员
c++编程提倡使用标准库,一个原因是标准库大胆减少对指针的使用。但是许多程序是离不开指针的。包含指针的类需要特别注意复制控制,原因是复制指针时只复制指针中的地址,而不复制指针所指向的对象。这样当把一个对象复制给另一个对象后,当改变一个对象后,另一个对象也会收到牵连。另外一个对象释放掉后,其指针已经被释放掉。而另一个对象还不知道,其实该对象中的指针已经成为悬垂指针。这样再操作就会出现错误。
1. 定义智能指针类
原理:定义一个计数的类,所有复制的都是指向这一个类,每复制一次,该类加1一次;每析构一次,该类减1一次。当次数为0时,释放掉动态申请的空间。
图例:
1)定义一个对象
2)复制一个对象
#include <iostream> #include <string> using namespace std; class HasPtr;
//定义计数类 class U_Ptr { //没有访问标号,默认为private,保证类的隐私,但是友员类可以随意访问(包括private) friend class HasPtr; U_Ptr(int *p) : ip(p), use(1) {} ~U_Ptr() { cout << "hello" << use << endl; delete ip; } int *ip; size_t use; //次数 }; class HasPtr { public: HasPtr(int *p, int v) : ptr(new U_Ptr(p)), val(v) {} HasPtr(const HasPtr &orig) : ptr(orig.ptr), val(orig.val) { ++ptr->use; } HasPtr& operator=(const HasPtr &orig); ~HasPtr() { cout << "hahha::" << ptr->use << endl; if(--ptr->use == 0) delete ptr; } private: U_Ptr *ptr; int val; }; HasPtr& HasPtr::operator=(const HasPtr &orig) { ++orig.ptr->use; if(--ptr->use == 0) delete ptr; ptr = orig.ptr; val = orig.val; return *this; } int main() { int i = 56, j = 12; int *p = new int(56); HasPtr hasptr(p, j); HasPtr hasptr2(hasptr); }
2. 定义值型类
给指针成员提供语义值。具有值语义的类所定义的对象,其行为很像算术类型的对象:复制值型对象时,会得到一个不同的版本。对副本的改变不会反映在原有对象上。
#include <iostream> #include <string> using namespace std; class HasPtr { public: HasPtr(const int &p, int v) : ptr(new int(p)), val(v) {} HasPtr(const HasPtr &orig) : ptr(new int(*orig.ptr)), val(orig.val) { } //复制值型对象时,会得到一个不同的版本 HasPtr& operator=(const HasPtr &orig); ~HasPtr() { delete ptr; } private: int *ptr; int val; }; HasPtr& HasPtr::operator=(const HasPtr &orig) { *ptr = *orig.ptr; //赋值时,只改变指针指向的值,但是指针是不变的 val = orig.val; return *this; } int main() { int i = 56, j = 12; HasPtr hasptr(i, j); HasPtr hasptr2(hasptr); hasptr2 = hasptr; }
手把手教你使用FineUI开发一个b/s结构的取送货管理信息系统(附源码+视频教程(第7,8节))
一 本系列随笔概览及产生的背景
近阶段接到一些b/s类型的软件项目,但是团队成员之前大部分没有这方面的开发经验,于是自己选择了一套目前网上比较容易上手的开发框架(FineUI),计划录制一套视频讲座,来讲解如何利用FineUI快速开发一个小型的b/s结构的管理系统,已达到帮助团队成员快速掌握b/s结构信息系统的开发方法。
源码位置:https://github.com/kamiba/FineUIDemo
源码下载办法:安装SVN客户端(本文最后提供下载地址),然后checkout以下的地址:https://github.com/kamiba/FineUIDemo.git
初学者应先下载源代码,然后对照视频,一步一步跟着做。
演示地址:http://42.121.4.78:8055/ 用户名和密码 均为admin
作者计划将本系列博文+视频做成一个Step by Step系列,请初级读者关注,高手绕道。目录拟定如下:
2.系统需求及数据库设计;
3.产品分类信息管理之列表显示及数据删除,附带说明三层架构用法,数据库分页实现方法。
4.产品分类信息管理之新增记录和修改记录,使用代码比较工具Beyond Compare进行代码比较
5.加工人员管理(如何基于已开发完成的产品分类信息管理模块,采取拷贝,粘贴,批量替换的方式快速完成其他模块的开发)。
6.产品管理(数据库视图概念,多表连接,dropdownlist控件用法)。
9.支付管理,支付统计(grid控件,分页,数据表查询)
10.将取送货管理系统整合进AppBox2.0(AppBox是使用FineUI开发的开源的通用权限管理框架,目前最新版本是3.0)。
二 第7,8节视频的主要内容简介
1.实现取货管理,送货管理,取送货统计模块;
2.数据库重要查询技术---多表连接,嵌套子查询,内连接,左连接;
3.FineUI日期控件用法。
三 前八节视频下载地址及常用工具下载地址
1.FineUI+动软代码生成器开发一个b/s结构的取送货管理信息系统第一节
2.FineUI+动软代码生成器开发一个b/s结构的取送货管理信息系统第二节
3.FineUI+动软代码生成器开发一个b/s结构的取送货管理信息系统第三节
4.产品分类信息管理之新增记录和修改记录,使用代码比较工具Beyond Compare进行代码比较
5.加工人员管理(如何基于已开发完成的产品分类信息管理模块,采取拷贝,粘贴,批量替换的方式快速完成其他模块的开发)。
6.产品管理(数据库视图概念,多表连接,dropdownlist控件用法)。
10.SVN客户端安装包
四 第9节视频内容预告
1.支付管理;
2.支付统计管理;