#pragma once
class String; //string前置定义
///
/// Object类定义
///
class Object
{
public:
virtual String ToString()const;
};
#include "Object.h"
#include "String.h"
String Object::ToString() const
{
return String();
}
#pragma once
#include "Object.h"
class String : public Object
{
public:
String();
};
#include "String.h"
#include "Object.h"
String::String()
{
}
现在,同理,加一个链表,数组:
#pragma once
class String; //std:string前置定义
class List;
class ByteArray;
///
/// Object类定义
///
class Object
{
public:
String ToString()const;
};
下面是我Object类的例子:
/*******************************************************************************************
文件名 : Object.h
功能 : object 类
作者 : 李锋
手机 : 13828778863
Email : [email protected]
创建时间 : 2022年11月01日
最后一次修改时间 : -------------------------------------------------2023年03月27日
(1) 如果类定义中有指针或引用变量或对象,为了避免潜在错误,最好重载拷贝构造函数和赋值函数。
(2) 如果使你的类能够给其它可以排序功能的类使用,就必须重载 < > == 运算符
*********************************************************************************************/
#ifndef __OBJECT_H_
#define __OBJECT_H_
#include "_Macro.h"
_LF_BEGIN_
//#define _OBJECT_DEBUG_
//-----------------------------------------------------前置声明
class _ByteArray;
class _StrW;
class _StrA;
///
/// 不命名 _Object ,是因为跟 System::Object 同名
///
class _Object
{
private:
///
/// _Object 对象计数器
///
static __int64 _iObjectCount;
///
/// 是否进行全局初始化
///
static bool _bInitializeGlobal;
protected:
//inline virtual void InitData(const int& nBuffer, const int& nDefaultBuffer = 15) {};
//inline virtual void InitData() {};
public://----------------------------------------------构造析构
_Object();
virtual ~_Object();
public://----------------------------------------------重写接口
///
/// 清空数据
///
/// 创建时间:2022-11-13 最后一次修改时间:2022-11-13
inline virtual void ClearData() {};
///
/// 清空内存,重置为实始化状态
///
inline virtual void ClearMemory() {};
///
/// 返回用字符串表示的对象,如splitString分隔字符串不等于空,则每个对象用splitString分隔。
///
/// 分隔字符串
/// 返回用字符表示的对象
/// 创建时间:2022-11-13 最后一次修改时间:2023-05-14
virtual _string ToSplitString(const _string &splitString) const;
///
/// 返回用字符串表示的对象,实际是返回虚拟函数 return ToSplitString(_t(""));
///
///
/// 创建时间:2023-05-15 最后一次修改时间:2023-05-15
_string ToString()const;
///
/// 把对象保存在内存中。
///
///
/// 创建时间:2022-11-13 最后一次修改时间:2023-03-12
inline virtual _ByteArray& PackageMemory(_ByteArray& baPackageMem) const;
///
/// 从内存中读出对象
///
/// 指向数据的指针
/// 开始读出的位置
/// 创建时间:2022-11-13 最后一次修改时间:2023-03-12
inline virtual void SplitFromMemory(const _byte* pPackageMem, const _uint nStart = 0);
///
/// 如果大于 oRight 则返回1,等于返回0,小于返回-1
///
///
///
/// 创建时间:2022-11-13 最后一次修改时间:2022-11-13
virtual int CompareTo(const _Object& oRight)const;
///
/// 释放本身内存,托管新的内存。
///
///
/// 数据长度
/// 使用内存长度
/// 创建时间:2023-01-04 最后一次修改时间:2023-01-05
virtual void TrusteeshipMem(const _byte* pData, const int nDataMemoryLength, const int& nMemoryLength);
///
/// 除非内存给其它对象托管,否则不要调用这个函数。
/// 放弃对象当前使用的内存,可能内存已托管给别的对象,
/// 重新初始化当前对象
///
/// 创建时间:2023-01-04 最后一次修改时间:2023-01-05
inline virtual void GiveUppMem(){}
///
/// 返回对象所使用的内存大小,以Byte计数。
///
///
/// 创建时间:2023-01-04 最后一次修改时间:2023-01-05
inline virtual int GetMemoryLength() { return 0; }
///
/// 返回对象数据所使用的内存大小,以Byte计数。
///
///
/// 创建时间:2023-01-04 最后一次修改时间:2023-01-05
inline virtual int GetDataMemoryLength() { return 0; }
public:
//-----------------------------------------------------------------运算符重载
///
/// 这个函数的意义在于,每个从继承自 _Object 类,都可以转换成 _string
///
/// 创建时间:2022-11-13 最后一次修改时间:2022-11-13
operator _string();
///
/// 强制转换为String
///
/// 创建时间:2023-04-29 最后一次修改时间:2023-04-29
operator _stdstr()const;
inline friend bool operator > (const _Object& oLeft, const _Object& oRight) { return oLeft.CompareTo(oRight) == 1; }
inline friend bool operator < (const _Object& oLeft, const _Object& oRight) { return oLeft.CompareTo(oRight) == -1; }
inline friend bool operator == (const _Object& oLeft, const _Object& oRight) { return oLeft.CompareTo(oRight) == 0; }
public:
///
/// 从文件中读取数据
///
/// 创建时间:2023-03-14 最后一次修改时间:2023-03-14
void ReadDataFromFile(const _string& sFullPathName);
///
/// 把数据保存在文件中
///
/// 创建时间:2023-03-14 最后一次修改时间:2023-03-14
void SaveDataToFile(const _string& sFullPathName);
///
/// 获取一个文件名
///
/// 创建时间:2023-03-14 最后一次修改时间:2023-03-14
_string GetFilePathName()const;
public://----------------------------------------------------------------属性
inline static __int64 GetObjectCount() { return _iObjectCount; }
__declspec(property(get = GetObjectCount)) __int64 ObjectCount;
_string GetTypeName() const;
///
///
///
__declspec(property(get = GetTypeName)) const _string ClassName;
};
_LF_END_
#endif
#include "_Object.h"
#include "_Debug.h"
#include "global_c_all.h"
_LF_BEGIN_
_int64 _Object::_iObjectCount = 0;
bool _Object::_bInitializeGlobal = false;
_Object::_Object()
{
#ifdef _OBJECT_DEBUG_
_cout << _t("_Object::_Object()\n");
#endif
++_iObjectCount;
if (!_bInitializeGlobal) {
setlocale(LC_ALL, "Chinese-simplified");//设置中文环境
_bInitializeGlobal = true;
}
}
_Object::~_Object()
{
#ifdef _OBJECT_DEBUG_
_cout << _t("_Object::~_Object()\n");
#endif
--_iObjectCount;
ClearData();
}
_string _Object::ToSplitString(const _string& splitString) const
{
_string sInfo = this->ClassName;
sInfo.Add(_t("未重写虚拟函数_string _Object::ToSplitString(const _string& splitString) const"));
return sInfo;
}
_string _Object::ToString() const
{
return ToSplitString(_t(""));
}
_ByteArray& _Object::PackageMemory(_ByteArray& baPackageMem) const
{
// TODO: 在此处插入 return 语句
return baPackageMem;
}
///
/// 从内存中读出对象
///
/// 指向数据的指针
/// 开始读出的位置
/// 创建时间:2022-11-13 最后一次修改时间:2023-03-12
void _Object::SplitFromMemory(const _byte* pPackageMem, const _uint nStart)
{
// TODO: 在此处插入 return 语句
}
int _Object::CompareTo(const _Object& oRight) const
{
_cout << _t("定义的对象:") << GetTypeName() + _t("需要重写虚拟函数 virtual int CompareTo(const _Object& oRight)\n");
return 1;
}
void _Object::TrusteeshipMem(const _byte* pData, const int nDataMemoryLength, const int& nMemoryLength)
{
ClearMemory();
}
_Object::operator _string()
{
return ToSplitString(_string());
}
_Object::operator _stdstr() const
{
return ToSplitString(_string()).std_c_str();
}
///
/// 从文件中读取数据
///
/// 创建时间:2023-03-14 最后一次修改时间:2023-03-14
void _Object::ReadDataFromFile(const _string& sFullPathName)
{
if (ga.gcf_FileExisits(sFullPathName))
{
_ByteArray ba;
ba.ReadFromFile(sFullPathName);
this->SplitFromMemory(ba.Data);
}
else
{
d.ShowError(sFullPathName + _t(" 文件不存在!"));
}
}
///
/// 把数据保存在文件中
///
/// 创建时间:2023-03-14 最后一次修改时间:2023-03-14
void _Object::SaveDataToFile(const _string& sFullPathName)
{
if (ga.gcf_FileExisits(sFullPathName))
{
_ByteArray ba;
this->PackageMemory(ba);
ba.WriteToFile(sFullPathName);
}
else
{
d.ShowError(sFullPathName + _t(" 文件不存在!"));
}
}
///
/// 获取一个文件名
///
/// 创建时间:2023-03-14 最后一次修改时间:2023-03-14
_string _Object::GetFilePathName()const
{
_string sName = ClassName;
int n = sName.IndexOf(_t("::"));
if ( n != -1)
{
sName = sName.SubStr(n + 2, sName.Length - n - 2);
}
else
{
n = sName.IndexOf(_t(" "));
sName = sName.SubStr(n + 1, sName.Length - n - 1);
}
return ga.dataPath + sName + _t(".dat");
}
_string _Object::GetTypeName()const
{
#ifdef _UNICODE_
std::wstring wText = gs.s_UTF8String_to_TextW(typeid(*this).name());
#ifdef _USE_LF_
return wText.c_str();
#else
return wText;
#endif
#else
return typeid(*this).name();
#endif
}
/*
//------------------------------------------------------------------------------------CSharp
bool _Object::CSharp_Equals(const _Object& obj)
{
return false;
}
bool _Object::CSharp_Equals(const _Object& objA, const _Object& objB)
{
return false;
}
void _Object::Finalize()
{
}
int _Object::CSharp_GetHashCode()
{
return 0;
}
Type_ _Object::CSharp_GetType()
{
return Type_();
}
_Object& _Object::CSharp_MemberwiseClone()
{
return *this;
}
bool _Object::CSharp_ReferenceEquals(const _Object& objA, const _Object& objB)
{
return false;
}
_string _Object::CSharp_ToString()
{
return _string();
}
*/
_LF_END_