【Cpp 基础】自定义getter和setter

getter 和 setter 有啥用?

在C++中,get和set方法通常是用于封装类的属性,以确保对属性的访问和修改是安全的。这些方法通常被称为“getter”和“setter”。

以下是一个示例类,其中包含一个私有整数属性“value”,以及一个公共的get方法和一个set方法:

class MyClass {
private:
    int value;

public:
    int getValue() const {return value;}
    void setValue(int newValue) {value = newValue;}
};

在上面的示例中,getValue()方法返回私有属性value的值,而setValue()方法将新的值赋给私有属性value。注意,getter和setter方法的名字可以自由选择,但是通常使用属性名加上后缀"get"或"set"来命名。

使用getter和setter方法的好处是,它们可以确保类的属性不会被外部代码直接访问或修改。这有助于保护类的数据,并减少因错误修改而导致的错误。同时,getter和setter方法可以添加额外的逻辑,例如验证输入或记录日志等。

 

c++ get与set方法的宏定义实现

一、文章来由

国庆节依然顽强的码代码,项目中需要用到 get 和 set 方法,但是问题来了,因为是 c++ 的,并不像 java 的 eclipse 有自动生成 get 和 set 方法。如果手写是可以,但是当属性特别多的时候会非常麻烦。。。但是宏定义方法可以搞定这个问题~~

二、具体代码

2.1 非指针类型成员变量

// PropertyBuilderByName 用于生成类的成员变量
// 并生成set和get方法
// type 为变量类型
// access_permission 为变量的访问权限(public, priavte, protected)

#define PropertyBuilderByName(type, name, access_permission)\
    access_permission:\
        type m_##name;\
    public:\
    inline void set##name(type v) {\
        m_##name = v;\
    }\
    inline type get##name() {\
        return m_##name;\
    }\

分析:

可以这样写的原因就是因为 #define 预处理,是在编译器编译之前执行的纯字符串替换,这里的 ##name 会直接被替换成传入的 name,所以该宏生成成员变量 m_name 由 name 决定,其访问权限由 acess_permission 指定

另外:

#define语句中的#是把参数字符串化,##是连接两个参数成为一个整体。

2.2 指针类型成员变量

同样的道理:

#define PointerPropertyBuilderByName(type, name, access_permission)\
    access_permission:\
        type* m_##name;\
    public:\
        inline void set##name(type* v){\
            m_##name = v;\
        }\
        inline type* get##name(){\
            return m_##name;\
        }\

2.3 test

class Test
{
    PropertyBuilderByName(int, A, private)
    PointerPropertyBuilderByName(double, DBV, private)
};

int main()
{
Test t;

t.setA(10);
cout << "A = " << t.getA() << endl;

double a = 12.3445;
t.setDBV(&a);
cout << "DBV: " << *(t.getDBV()) << endl;

system("pause");
return 0;

 

注:可以将上面的两个宏封装成 cplusplusgetset.h,然后应用的时候调用。

参考资料:

1. https://wenku.baidu.com/view/df2fff6a0a75f46527d3240c844769eae109a310.html

2.CSDN博主「This is bill」的原创文章:https://blog.csdn.net/Scythe666/article/details/48846761

3. https://blog.csdn.net/libaineu2004/article/details/92433479

posted @ 2024-01-04 22:18  FBshark  阅读(542)  评论(0编辑  收藏  举报