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

posted @   强里秋千墙外道  阅读(382)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示