好久没有写过程序,最近想学习下界面库的开发,基于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. SQL脚本添加删除修改字段

    1.增加字段     alter table docdsp     add dspcodechar(200)2.删除字段     ALTER TABLE table_NAME DROP COLUMNc ...

  2. vue 实战问题-watch 数组或者对象

    1.普通的watch data() { return { frontPoints: 0 } }, watch: { frontPoints(newValue, oldValue) { console. ...

  3. [CPP] Object Based Class

    前言 几年前接触到一款很好玩的RPG游戏,叫作CPP.最近想着怀念一下,又不想干巴巴地去玩.于是乎,我打算写几篇攻略,主要是记录一下游戏中一些奇妙的点.游戏的第一章是面向对象程序设计,其中又分为基于对 ...

  4. IOS多选单选相册图片

    之前做项目让实现多选相册的图片,自己写了一个demo一直保存在电脑上,今天下午发现电脑128G的容量已经快没有了,准备清理电脑,所以把之前做的一些demo放在博客上,以后方便用. 1.首先准备3个图片 ...

  5. 微信小程序 c#后台支付结果回调

    又为大家带来简单的c#后台支付结果回调方法,首先还是要去微信官网下载模板(WxPayAPI),将模板(WxPayAPI)添加到服务器上,然后在打开WxPayAPI项目中的example文件下的 Nat ...

  6. 对.net事件的看法

    对.net事件的看法 一.事件的本质 事件是软件系统里的两个子系统之间,或者两个模块之间,或者两个对象之间发送消息,并处理消息的过程.在面向对象的世界里,就可以统一认为是两个对象之间的行为. 两个对象 ...

  7. String.IsNullOrEmpty 与 String.IsNullOrWhiteSpace

    String.IsNullOrEmpty 指示指定的字符串是否为 null 或者 空字符串: 返回值:如果参数为 null 或者 空字符串("" .String.Empty),结果 ...

  8. lodop打印多页

    定义全局变量 var loop = null; 加载时候打印 window.On_CLodop_Opened = function () { print(); //OpenPreview()是调用打印 ...

  9. jenkins学习之centos6.9下安装

    以下为centos6.9下测试安装: docker下安装jenkins: 更新yum源: yum -y update 安装docker: yum -y install docker-io 启动dock ...

  10. ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)

    在写这篇的时候本来想把标题直接写成报错的提示,如下: “SecurityError:Blocked a frame with origin "http://localhost:55080&q ...