目录
应用场景
运行准备
代码展示
结果显示
应用场景
当我们在编写类的属性时,需要对该属性进行封装,需要一系列的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函数的实现
cpp.txt
h.txt