在编程中离不开对数据的获取与处理,本文介绍一种比较安全又比较简单的数据的获取方式,以C++为例,主要借助friend来完成。
将涉及到数据的代码分为3类:数据类ClassData、数据的获取类ClassGetData、数据的使用者类ClassUseData。ClassGetData用于构造ClassData,供ClassUseData使用;ClassUseData对ClassData只有使用权,没有修改权。
//数据类,包含较多属性
class ClassData
{
public:
string GetName()//获取名称
{
return m_Name;
}
int GetAge()//获取年龄
{
return m_Age;
}
protected:
void SetName(const string&name)//设置名称
{
m_Name=name;
}
void SetAge(const int&age)//设置年龄
{
m_Age=age;
}
friend class ClassGetData;//如果不考虑继承,只有ClassGetData能访问Set方法
private:
int m_Age;
string m_Name;
};
//获取数据的桥,从数据库Excel等源获取散列数据后,逐条构造ClassData对象,
//通过ClassData的SetData方法设置对象的具体数据(名称 年龄),将所有ClassData对象存储到m_DataList,通过GetDataGroup供使用者使用
class ClassGetData
{
public:
ClassGetData()
{
GenerateDataList();
}
void GetDataGroup(vector<ClassData>& vecData)
{
vecData=m_DataList;
}
protected:
private:
void GenerateDataList()
{
//从数据源获取散列数据
ClassData data1;//之所以不用构造函数直接传参,是因为数据往往不只是本例的2条简单数据
data1.SetName("data1");
data1.SetAge(1);
m_DataList.push_back(data1);
ClassData data2;
data2.SetName("data2");
data2.SetAge(2);
m_DataList.push_back(data2);
}
vector<ClassData> m_DataList;
};
//数据的使用者,通过ClassGetData获取数据的列表
class ClassUseData
{
public:
void ToUseData()////获取及使用数据
{
vector<ClassData> vecData;
ClassGetData dataBridge;
dataBridge.GetDataGroup(vecData);
for (int i=0;i<vecData.size();i++)
{
int age=vecData[i].GetAge();
string name=vecData[i].GetName();
cout<<"name:"<<name<<",age:"<<age<<endl;
////只能从ClassData中获取具体数据,无法对ClassData数据进行更改,以下编译不过
//vecData[i].SetAge(age);
//vecData[i].SetName(name);
}
}
protected:
private:
};
void main()
{
ClassUseData useData;
useData.ToUseData();
}