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函数的实现
热门推荐
双十一实习总结:如何写出高赞标题?
心理学家揭秘:如何赢得巨蟹男的信任
巨蟹男最在意的安全感,你get到了吗?
中国AR眼镜行业分类、市场运行态势及产业链全景图谱分析
真实夫妇交友视频:夫妻如何通过视频与他人建立深厚友谊
双十一剁手党必看:荣事达保温杯清洁大揭秘!
倪海厦讲熬药方法(倪海厦常用经典配方)
人工智能浪潮下,大模型与虚拟现实走向何方?
调节血糖的功能性食品
奇亚籽怎么吃 吃奇亚籽的好处
《神奇动物在哪里》:重回J.K.罗琳的魔法世界
低回撤基金成避风港!“固收+”策略受追捧
逃避责任的心理机制大揭秘!
人工智能与心理健康:机遇与挑战并存的新领域
AR技术发展现状与未来趋势
八津紫:《action对魔忍》新手必备攻略
《鬼灭之刃》里的忍者原型揭秘
牛里脊 vs 瘦猪肉:谁是餐桌上的健康之王?
猪里脊和牛柳的健康烹饪方法
妈妈如何为女儿求姻缘?求姻缘的方法与建议
网络小说中的奇幻元素探讨
大师口中的“软硬科幻”到底是什么?
数字化校园实习系统:让实习管理更高效便捷
从李达康看小说角色塑造技巧:如何让角色更加立体真实
戏曲元素:角色扮演的点睛之笔
喜马拉雅上线《人间鲁迅》,解读时代巨匠的多面人生
《迪迦奥特曼》:特摄剧特效进化史
智能穿戴设备实用吗?如何提升用户体验?
《龙背上的歌姬》:终焉之花的百合誓言
看见自我拯救的力量,心理疗愈书《我的骨头没有忘记》首次引进