C++实现自动生成c++类中的属性的get和set方法

目录

应用场景

运行准备

代码展示

结果显示


应用场景

当我们在编写类的属性时,需要对该属性进行封装,需要一系列的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aogu181

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值