问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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函数的实现

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号