牛骨文教育服务平台(让学习变的简单)
博文笔记

C++实现软件版本号管理类

创建时间:2014-12-18 投稿人: 浏览次数:200

最近做了个更新程序,更新下配置文件后通过对比版本号大小来确定是否有更新。原来仅仅只是简单的比较字符串的大小,用_tcscmp来做的,但是在形如:2.2.12.6和2.2.9.6对比时,明显会不对。于是就用C++写了一二个简单的版本号转化、对比的类。

代码如下:

#pragma once
#include <string>
using std::wstring;


class CVersion
{
public:
	CVersion()
		:m_nMajorNumber(0)
		,m_nMinorNumber(0)
		,m_nRevisionNumber(0)
		,m_nBuildNumber(0)
	{

	} 
	CVersion(const wstring& strVersion)
		:m_nMajorNumber(0)
		,m_nMinorNumber(0)
		,m_nRevisionNumber(0)
		,m_nBuildNumber(0)
	{
		GetVersion(strVersion);
	}
	virtual ~CVersion()
	{
	}
	bool IsDigitString(const wstring& strValue)
	{
		if ( strValue.empty() )
			return false;
		for ( size_t i=0; i<strValue.size(); ++i )
		{
			if ( !iswdigit(strValue[i]) )
				return false;
		}
		return true;
	}
	bool GetVersion(const wstring& strVersion)
	{
		int nBegin=0, nPos = 0;
		vector<wstring>	numList;
		wstring strSub;
		while( (nPos = strVersion.find(L".", nBegin)) != wstring::npos )
		{
			strSub = strVersion.substr(nBegin, nPos-nBegin);
			if ( strSub.empty() )
				return false;
			if ( !IsDigitString(strSub) )
				return false;
			numList.push_back(strSub);
			nBegin = nPos+1;
		}
		if ( nBegin < strVersion.size() )
		{
			strSub = strVersion.substr(nBegin, strVersion.size()-nBegin);
			if ( IsDigitString(strSub) )
				numList.push_back(strSub);
		}
		if ( numList.size()<2 )
			return false;
		m_nMajorNumber = _wtoi(numList[0].c_str());
		m_nMinorNumber = _wtoi(numList[1].c_str());
		if ( numList.size()>2 )
			m_nRevisionNumber = _wtoi(numList[2].c_str());
		if ( numList.size()>3 )
			m_nBuildNumber = _wtoi(numList[3].c_str());
		return true;
	}
	int	 Compare(const CVersion& ver)
	{
		if ( m_nMajorNumber > ver.m_nMajorNumber )
			return 1;
		if ( m_nMajorNumber < ver.m_nMajorNumber )
			return -1;
		if ( m_nMinorNumber > ver.m_nMinorNumber )
			return 1;
		if ( m_nMinorNumber < ver.m_nMinorNumber )
			return -1;
		if ( m_nRevisionNumber > ver.m_nRevisionNumber )
			return 1;
		if ( m_nRevisionNumber < ver.m_nRevisionNumber )
			return -1;
		if ( m_nBuildNumber > ver.m_nBuildNumber )
			return 1;
		if ( m_nBuildNumber < ver.m_nBuildNumber )
			return -1;
		return 0;
	}
	bool operator ==(const CVersion& ver)
	{
		return Compare(ver) == 0;
	}
	bool operator !=(const CVersion& ver)
	{
		return Compare(ver) != 0;
	}
	bool operator <(const CVersion& ver)
	{
		return Compare(ver) < 0;
	}
	bool operator >(const CVersion& ver)
	{
		return Compare(ver) > 0;
	}
private:
	int	m_nMajorNumber;
	int     m_nMinorNumber;
	int	m_nRevisionNumber;
	int     m_nBuildNumber;
};




版本成员主要包括:主版本号、次版本号、修正版本号、编译版本号,关于具体的版本命名规则可以查看前面转载的文章软件版本命名规则

如何使用这个类的话,也不用细说了吧,可以直接构造时传入版本字符串,也可以调用GetVersion函数来初始化版本号信息。

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。