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