好久没有写过程序,最近想学习下界面库的开发,基于directui的界面个人觉得还不错,像金山的源代码和duilib都是不错的。本人想结合二者做一个轻量级的界面库,同时又不依赖于常用的MFC、WTL等。在程序开发中字符串的使用是必须的,C++语音没有原生字符串,STL等标准库又多是模板类,如果开发DLL导出时就出现问题了。今天从WTL库里摘出来一个简单的字符串类,实现了基本功能,可在此基础上进行扩展。

  头文件

 struct CStringDataE
{
long nRefs;
int nDataLength;
int nAllocLength;
TCHAR* data() { return (TCHAR*)(this + ); }
};
_declspec(selectany) int rgInitData[] = { -, , , };
_declspec(selectany) CStringDataE* _atltmpDataNil = (CStringDataE*)&rgInitData;
_declspec(selectany) LPCTSTR _atltmpPchNil = (LPCTSTR)(((BYTE*)&rgInitData) + sizeof(CStringDataE));
class UI_API CUIString
{
public:
CUIString(void);
CUIString(const CUIString& stringSrc);
~CUIString(void); CUIString& operator =(const CUIString& stringSrc);
CUIString& operator =(TCHAR ch);
CUIString& operator =(LPCTSTR lpsz);
protected:
LPTSTR m_pchData; // pointer to ref counted string data
CStringDataE* GetData() const;
void Init();
BOOL AllocBuffer(int nLen);
void AssignCopy(int nSrcLen, LPCTSTR lpszSrcData);
BOOL AllocBeforeWrite(int nLen);
void Release();
static const CUIString& PASCAL _GetEmptyString();
};

源文件

 #include "stdafx.h"
#include "UIString.h"
#include "tchar.h"
#include "limits.h"
#include "assert.h"
CUIString::CUIString(void)
{
Init();
}
CUIString::CUIString(const CUIString& stringSrc)
{
assert(stringSrc.GetData()->nRefs != );
if (stringSrc.GetData()->nRefs >= )
{
assert(stringSrc.GetData() != _atltmpDataNil);
m_pchData = stringSrc.m_pchData;
InterlockedIncrement(&GetData()->nRefs);
}
else
{
Init();
*this = stringSrc.m_pchData;
}
}
// overloaded assignment
CUIString& CUIString::operator =(const CUIString& stringSrc)
{
if (m_pchData != stringSrc.m_pchData)
{
if ((GetData()->nRefs < && GetData() != _atltmpDataNil) || stringSrc.GetData()->nRefs < )
{
// actual copy necessary since one of the strings is locked
AssignCopy(stringSrc.GetData()->nDataLength, stringSrc.m_pchData);
}
else
{
// can just copy references around
Release();
assert(stringSrc.GetData() != _atltmpDataNil);
m_pchData = stringSrc.m_pchData;
InterlockedIncrement(&GetData()->nRefs);
}
}
return *this;
}
CUIString& CUIString::operator =(TCHAR ch)
{
assert(!_istlead(ch)); // can't set single lead byte
AssignCopy(, &ch);
return *this;
}
CUIString& CUIString::operator =(LPCTSTR lpsz)
{
assert(lpsz!= NULL );
AssignCopy(lstrlen(lpsz), lpsz);
return *this;
}
CUIString::~CUIString(void)
{
if (GetData() != _atltmpDataNil)
{
if (InterlockedDecrement(&GetData()->nRefs) <= )
delete[](BYTE*)GetData();
}
} void CUIString::Init()
{
m_pchData = _GetEmptyString().m_pchData;
} BOOL CUIString::AllocBuffer(int nLen)
{
assert(nLen >= );
assert(nLen <= INT_MAX - ); // max size (enough room for 1 extra)
if (nLen == )
{
Init();
}
else
{
CStringDataE* pData = NULL;
assert(pData = (CStringDataE*)new BYTE[sizeof(CStringDataE) + (nLen + ) * sizeof(TCHAR)]);
if (pData == NULL)
return FALSE;
pData->nRefs = ;
pData->data()[nLen] = TEXT('\0');
pData->nDataLength = nLen;
pData->nAllocLength = nLen;
m_pchData = pData->data();
}
return TRUE;
}
CStringDataE* CUIString::GetData() const
{
assert(m_pchData != NULL);
return ((CStringDataE*)m_pchData) - ;
}
void CUIString::AssignCopy(int nSrcLen, LPCTSTR lpszSrcData)
{
if (AllocBeforeWrite(nSrcLen))
{
memcpy(m_pchData, lpszSrcData, nSrcLen * sizeof(TCHAR));//需改动
//SecureHelper::memcpy_x(m_pchData, (nSrcLen + 1) * sizeof(TCHAR), lpszSrcData, nSrcLen * sizeof(TCHAR));
GetData()->nDataLength = nSrcLen;
m_pchData[nSrcLen] = TEXT('\0');
}
} BOOL CUIString::AllocBeforeWrite(int nLen)
{
BOOL bRet = TRUE;
if (GetData()->nRefs > || nLen > GetData()->nAllocLength)
{
Release();
bRet = AllocBuffer(nLen);
}
assert(GetData()->nRefs <= );
return bRet;
}
void CUIString::Release()
{
if (GetData() != _atltmpDataNil)
{
assert(GetData()->nRefs != );
if (InterlockedDecrement(&GetData()->nRefs) <= )
delete[](BYTE*)GetData();
Init();
}
} const CUIString& CUIString::_GetEmptyString()
{
return *(CUIString*)&_atltmpPchNil;
}

欢迎吐槽

C++字符串类的更多相关文章

  1. Core Java 总结(字符和字符串类问题)

    所有代码均在本地编译运行测试,环境为 Windows7 32位机器 + eclipse Mars.2 Release (4.5.2) 2016-10-17 整理 字符,字符串类问题 正则表达式问题 J ...

  2. Java:字符串类String的功能介绍

    在java中,字符串是一个比较常用的类,因为代码中基本上处理的很多数据都是字符串类型的,因此,掌握字符串类的具体用法显得很重要了. 它的主要功能有如下几种:获取.判断.转换.替换.切割.字串的获取.大 ...

  3. Qt入门-字符串类QString

    原地址:http://blog.csdn.net/xgbing/article/details/7770854 QString是Unicode字符的集合,它是Qt API中使用的字符串类. QStri ...

  4. 可变字符串类 StringBuilder

    string类创建的字符串是不可变的(同一内存中),每更改一次,就会新开辟内存,不利于高效频繁操作. 当频繁操作同一字符串变量时,建议使用StringBuilder. 可变字符串类StringBuil ...

  5. Java开发知识之Java字符串类

    Java开发知识之Java字符串类 一丶简介 任何语言中.字符串都是很重要的.都涉及到字符串的处理. 例如C++中. 字符串使用内存. 并提供相应的函数进行处理 strcmp strcat strcp ...

  6. C++自定义String字符串类,支持子串搜索

    C++自定义String字符串类 实现了各种基本操作,包括重载+号实现String的拼接 findSubStr函数,也就是寻找目标串在String中的位置,用到了KMP字符串搜索算法. #includ ...

  7. 设计一个字符串类String(C++练习题)

    要求:设计一个字符串类String,可以求字符串长度,可以连接两个串(如,s1=“计算机”,s2=“软件”,s1与s2连接得到“计算机软件”),并且重载“=”运算符进行字符串赋值,编写主程序实现:s1 ...

  8. JAVA字符串类

    一.字符串类String1.String是一个类,位于java.lang包中2.创建一个字符串对象的2种方式: String 变量名=“值”; String 对象名=new String(“值”);3 ...

  9. 编码实现字符串类CNString实现运算符重载

    题目描述: 编码实现字符串类CNString,该类有默认构造函数.类的拷贝函数.类的析构函数及运算符重载,需实现以下"="运算符."+"运算."[]& ...

  10. Problem B 字符串类(I)

    封装一个字符串类,用于存储字符串和处理的相关功能,支持以下操作: 1. STR::STR()构造方法:创建一个空的字符串对象. 2. STR::STR(const char *)构造方法:创建一个字符 ...

随机推荐

  1. memcached 学习笔记 5

     memcached installed on linux 使用的操作系统是centos6.5 (有桌面) 1 上传libebent和memcache到/usr/local/src [root@jt ...

  2. MTCNN 实现人脸识别

    MTCNN(Multi-task CNN) MTCNN难点 WIDER FACE等数据集为我们提供的图片并不是MTCNN支持的训练样本, 需要通过几个脚本将其转为MTCNN可以接受的数据集, 这些脚本 ...

  3. 读取excel的方法(可用于批量导入)

    FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read); //1. Reading from a binary ...

  4. C# 随机数类

    using System; namespace DotNet.Utilities { /// <summary> /// BaseRandom /// 产生随机数 /// /// 随机数管 ...

  5. 使用nodeJs在本地搭建最简单的服务

    在搭建web服务器之前,需要先安装node.js 安装后node.js,接下来就需要安装http的镜像文件 一:本机安装软件 下载最新的NodeJs,进行安装.一直点击下一步就可以了.然后就可以查看安 ...

  6. NSURLSession和NSURLConnection

    iOS9.0之后NSURLConnection被注销,采用NSURLSession,先介绍NSURLSession,然后介绍NSURLConnection 1.NSURLSession: post请求 ...

  7. 撩课-Java每天5道面试题第10天

    撩课Java+系统架构 视频 点击开始学习 81.Servlet的会话机制? HTTP 是一种无状态协议, 这意味着每次客户端检索网页时, 都要单独打开一个服务器连接, 因此服务器不会记录下 先前客户 ...

  8. Hive & SparkSQL 比较

    Hive 在  Hadoop 集群上所有数据的访问都是通过 Java 编写的 MapReduce 作业来完成的,这些让 Java 程序员来完成没有问题. 但是对 SQL 程序员来说,写 MapRedu ...

  9. LinkedList实现队列存储结构

    package com.tercher.demo; import java.util.LinkedList; public class Queue { //用LinkedList 实现队列的数据存储结 ...

  10. BZOJ4659:lcm

    传送门 题目所给的不合法的条件可以转化为 \[\exists p,p^2|gcd(a,b) \Leftrightarrow \mu(gcd(a,b))\ne 0\] 那么 \[ans=\sum_{a= ...