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函数的实现
热门推荐
成都名小吃:夫妻肺片与钵钵鸡的前世今生
成都名小吃:从街头美食到世界文化遗产
香菇木耳:老年人的健康食材之选
台山游玩攻略:一日游的绝佳景点推荐
京津冀科普大赛教你安全吃菇:从识别到食用全攻略
昆明美食探秘:前十名必尝佳肴,让你品味春城的独特风味
适合学生的英文励志电影推荐:励志电影中的成长与启迪
昆明值得去的五个地方,你去过哪几个?
昆明周边旅游攻略:石林、滇池等景点详解及三日游行程规划
道宝河村:石头王国里的乡村旅游新探索
湖南美食大挑战:你敢尝几道?
《湖湘一万年》:揭秘湖南古稻田遗址与文明起源
“微信文字讨好症”:如何在虚拟世界里保持真诚?
深入解析“犯太岁”的文化意义与人们的应对方式
天津早点,不仅仅是美食,更是舌尖上的记忆
武汉热干面的制作与起源
“深入解析‘犯太岁’的文化意义与人们的应对方式”
西红柿炖牛腩的完美烹饪指南:简单易学,美味可口
70岁司机年审攻略:定期体检保平安
驾照新规:70岁也能开车啦!
资深老司机教你省心养车妙招
重阳节特辑:老年司机年审保障出行安全
汪峰官宣新恋情引热议:与章子怡离婚不到七个月,网友质疑“无缝衔接”
从汪峰章子怡离婚看现代人婚姻观:结婚率创新低背后
《四季有味》:一本让你轻松搞定年夜饭的美食指南
抖音“春节不打烊”:小商家如何借力营销实现业绩突破?
埃及沙姆沙伊赫:全年最佳旅行指南
冬季潜水天堂:埃及沙姆沙伊赫
古代的金融创新:柜坊与飞钱
健康饮食西兰花鸡肉