C++ 怎么写set/get函数?

背景

相信很多和我一样从习惯了使用Java的lombok自动生成set/get方法,但是到了C++却只能自己一个一个写,那么C++就没有相关的方法了吗?答案当然不是,C++可以使用宏来实现类似的功能,那么今天我就来记录一下如何在C++中用宏实现set/get功能。

具体使用方法

在我做项目的实践过程中,无意间发现VTK中有set/get的实现,俗话说,它山之石可以攻玉,更不要说VTK这种大型的开源项目了,有兴趣的可以去下载源码,里面许多C++的用法都值得借鉴。

首先我来到了set/get头文件,忽略掉预编译和版本适配的内容,核心内容如下:


#define vtkSetMacro(name, type)                                                                    \
  virtual void Set##name(type _arg)                                                                \
  {                                                                                                \
                                                \
    if (this->name != _arg)                                                                        \
    {                                                                                              \
      this->name = _arg;                                                                           \
                                                                                  \
    }                                                                                              \
  }
#define vtkSetMacroOverride(name, type)                                                            \
  void Set##name(type _arg) override                                                               \
  {                                                                                                \
                                            \
    if (this->name != _arg)                                                                        \
    {                                                                                              \
      this->name = _arg;                                                                           \
                                                                                  \
    }                                                                                              \
  }

//
// Get built-in type.  Creates member Get"name"() (e.g., GetVisibility());
//
#define vtkGetMacro(name, type)                                                                    \
  virtual type Get##name() const                                                        \
  {                                                                                                \
                                        \
    return this->name;                                                                             \
  }

可以看到你要给宏传递一个参数名和参数类型,get里面还有const注意这个细节,就是不让你改成员的值。甚至他还是一个虚函数,为子类还提供了override的函数。具体可以看我下面如何使用的。

这个文件是我编译过的,可以直接使用,比如我就用一个类测试了这个set/get宏,如下

#include "SetGet.h"
#include<iostream>
#include<string>
class Test1{
public:
    vtkSetMacro(a, std::string);
    vtkGetMacro(a, std::string);
    std::string a;
};

class Test1Child: public Test1{
    vtkSetMacroOverride(a, std::string);
};

int main(){
    Test1 t;
    t.Seta("10220");
    
    std::cout << t.Geta();
    
    return 0;
}

程序的输出是:

符合设定。

我的环境是mac os ventura,xcode 14。

总结

如果自己的项目有很多的属性设置,需要使用set/get,那么可以把我上面的代码直接复制到项目中。

在源代码中还有设置enum的,可以自己去慢慢研究。

引用

https://gitlab.kitware.com/vtk/vtk/-/blob/master/Common/Core/vtkSetGet.h

C++中,可以使用类和成员函数来实现get、set、subscribe接口的设计。 下面是一个示例类的设计: ```c++ class Device { public: Device(int id); double getTemperature(); void setTemperature(double temperature); void subscribeTemperature(std::function<void(double)> callback); private: int id_; double temperature_; std::vector<std::function<void(double)>> callbacks_; }; Device::Device(int id) : id_(id), temperature_(0.0) {} double Device::getTemperature() { return temperature_; } void Device::setTemperature(double temperature) { temperature_ = temperature; for (auto &callback : callbacks_) { callback(temperature_); } } void Device::subscribeTemperature(std::function<void(double)> callback) { callbacks_.push_back(callback); } ``` 该类实现了一个Device设备的温度读取、修改和订阅功能。其中,getTemperature()函数用于获取当前温度值,setTemperature()函数用于修改温度值,并通知所有订阅者,subscribeTemperature()函数用于订阅温度值的变化,并注册回调函数。使用该类时,可以按照以下方式进行调用: ```c++ Device device(1); device.subscribeTemperature([](double temperature) { std::cout << "Temperature changed: " << temperature << std::endl; }); device.setTemperature(25.4); double temperature = device.getTemperature(); ``` 上述代码中,首先创建了一个Device对象,并注册了一个订阅温度变化的回调函数。然后,调用setTemperature()函数修改温度值,并会触发回调函数。最后,调用getTemperature()函数获取当前温度值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值