C++实现自动生成c++类中的属性的get和set方法
创作时间:
作者:
@小白创作中心
C++实现自动生成c++类中的属性的get和set方法
引用
CSDN
1.
https://blog.csdn.net/qq_52308536/article/details/139885413
应用场景
当我们在编写类的属性时,需要对该属性进行封装,需要一系列的get和set的方法。例如下面是天气类的成员属性。可以看到属性很多,而写get和set都是一些固定的操作,因此可以直接用代码直接生成。
private:
std::string date; // 日期
std::string week; // 星期几
int high_temp; // 最高温度
int low_temp; // 最低温度
std::string weather_status; // 天气状况
int weather_code; // 天气代码
std::string city_name; // 城市名字
int humidity; // 湿度
std::string air_quality; // 空气质量
std::string aqi; // 空气质量指数
std::string wind_direction; // 风向
int wind_scale; // 风的等级
int pm25; // PM2.5
std::string flu_details; // 感冒温馨提示
运行准备
首先先创建一个文件,data.txt,里面存放上面属性,如下图所示。每个属性一行,首尾可以有空格
代码展示
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <cctype> // 包含 toupper 函数
using namespace std;
std::string formatString(const std::string &input)
{
std::string output;
bool capitalizeNext = true; // 标记下一个字母是否需要大写
for (char c : input)
{
if (c == '_')
{
capitalizeNext = true; // 下一个字符需要大写
}
else
{
if (capitalizeNext)
{
output += std::toupper(c); // 如果需要大写,转换当前字符
capitalizeNext = false;
}
else
{
output += c; // 否则,直接添加当前字符
}
}
}
if (!output.empty())
{
output[0] = std::toupper(output[0]); // 确保第一个字符大写
}
return output;
}
/**
* 去除字符串两边的空格
*/
std::string trim(const std::string &str)
{
auto not_space = std::not1(std::ptr_fun<int, int>(isspace));
auto left = std::find_if(str.begin(), str.end(), not_space);
auto right = std::find_if(str.rbegin(), str.rend(), not_space).base();
// 确保找到了非空格字符
if (left != str.end() && right != str.begin())
{
return std::string(left, right);
}
else
{
return str;
}
}
int main()
{
ifstream in("./data.txt");
if (!in.is_open())
{
cerr << "open file error " << endl;
}
ofstream out;
out.open("h.txt"); // 存头文件里的定义
ofstream outpp;
outpp.open("cpp.txt"); // 存c文件的实现
string buf;
cout << "请输入类名:";
string className;
cin >> className;
while (getline(in, buf))
{
buf = trim(buf);
int index = buf.find(' ');
string prefix = buf.substr(0, index + 1);
string var = buf.substr(index + 1, buf.length() - index - 2);
string suffix_1 = "get" + formatString(var) + "();";
string suffix_2 = "set" + formatString(var) + "(" + prefix + var + ");";
out << prefix + suffix_1 + "\n";
out << "void " + suffix_2 + "\n\n";
// 实现cpp
outpp << prefix + className + "::" + suffix_1.substr(0, suffix_1.length() - 1) + "\n{\n\treturn this->" + var + ";\n}\n";
outpp << "void " + className + "::" + suffix_2.substr(0, suffix_2.length() - 2) + ")" + "\n{\n\tthis->" + var + " = " + var + ";\n}\n\n";
}
cout << "生成成功!" << endl;
in.close();
out.close();
outpp.close();
return 0;
}
结果显示
复制后,直接运行,注意需要在c++11以上环境编译
可以看到生成两个文件,其中 h,txt存放get和set函数的定义,cpp.txt存放的是get和set函数的实现
热门推荐
电机绝缘电阻详解:如何使用Megger测试仪进行电机维护?
终末期肝病的运动康复:如何在保健中保持活力?
殷商时期的历史为何如此神秘?
闲置多年,这些高铁站终于重启了
闲置多年,这些高铁站终于重启了
快递案件最新法律进展分析:消费者权益保护的司法实践与启示
狗狗体检全攻略:14个关键步骤与实用准备清单
沉浸式体验“二月二”传统文化 从民俗与美食中感受“中国范儿”
人工智能板块如何盈利
选择种植牙的专业建议
蒙脱石散的副作用大吗?详述蒙脱石散作用及副作用
政策性农房保险合同:农村房屋保障的法律机制
如何设计一个用户友好的高效网站
三月生辰石——海蓝宝石:从历史到选购的全面指南
新能源汽车电池报告查询指南及续航影响因素全解析
能耗费用的计算方法有哪些?这些方法如何帮助节约能源成本?
如何科学地提高身高
姓氏与八字命理关系表大全:探索姓氏如何影响个人八字命理
个体工商户注册与公司注册:手续、税务与法律责任全方位对比
如何在Excel中选择全部具有错误值的单元格?
动物们解渴的“妙招”:揭秘如何在沙漠中生存
养老院中的无障碍扶手需要因地制宜的进行设计安装
迈向万亿GDP,广东第五城惠州何以狂飙?
吊顶侧面如何进行有效封闭处理?这种封闭处理有哪些材料选择?
项目进度如何直观展示
探索技术哲学:理解科技对人类的深远影响
AI写论文不能越过学术诚信的边界
Golang编程语言的优势和劣势深度评估!
中部非省会第一城,又变了
半盏茶的时间是多久