前言
最近在开发unity游戏的时候,面对庞大复杂的不同类之间进行数据交换和调用,我们必须做好类数据的信息管理,往往我希望暴露给其他类越少越好,这时候我就利用了C#的一个语言特性
public PlayerStateMachine stateMachine{ get ; private set ; }
熟悉的朋友不应该陌生,在面向对象编程中,setter
和 getter
是用于访问和修改私有成员变量的方法。它们通常用于封装(encapsulation),这是一种将数据和行为组合在一个单元(即类)中,并仅通过公共接口访问和操作这些成员的技术。 然后在C++中,却没有提供这个内置的语言特性,本期我来分享一个可复用的C++ 可复用setter 和getter设计
C++ 普通getter和setter的实现
在正常情况下,setter和getter在C++没有原生态支持的情况下,我们可以仿照其设计思路,完成下述代码。
class Context {
private :
int value;
public :
void setValue ( const int & v) { value = v; }
int getValue ( ) const { return value; }
} ;
上述代码看起来没有任何问题,在private
作用域下,用户需要访问value
必须通过getValue()
,如果我们只希望用户能得到数值而不允许用户修改,我们只需要保留getValue()
函数即可 然后上述代码存在一个潜在的问题,当一个类中存在多个像这样维护的变量,那我岂不是要定义一堆新的getter函数
public :
int getValue1 ( ) const { return value1; }
int getValue2 ( ) const { return value2; }
int getValue3 ( ) const { return value3; }
int getValue4 ( ) const { return value4; }
int getValue5 ( ) const { return value5; }
宏实现
这里使用宏 PUBLIC_GETTER_PRIVATE_SETTER
来定义一个带有公共获取器和私有设置器的成员变量。
# define PUBLIC_GETTER_PRIVATE_SETTER ( memberType, memberName) \
private : \
memberType memberName; \
public : \
memberType get ## memberName ( ) const { return memberName; } \
# include <iostream>
class Context {
public :
Context ( ) : value1 ( 10 ) { }
PUBLIC_GETTER_PRIVATE_SETTER ( int , value1) ;
} ;
int main ( ) {
Context context;
std:: cout << context. getvalue1 ( ) << std:: endl;
return 0 ;
}
# define PUBLIC_GETTER_PRIVATE_SETTER ( memberType, memberName) \
private : \
memberType memberName; \
public : \
memberType get ## memberName ( ) const { return memberName; } \
class A {
PUBLIC_GETTER_PRIVATE_SETTER ( int , value) ;
public :
A ( ) : value ( 10 ) { }
} ;
# include <iostream>
class Context {
public :
Context ( ) : a ( new A ( ) ) { }
PUBLIC_GETTER_PRIVATE_SETTER ( A* , a) ;
} ;
int main ( ) {
Context context;
std:: cout << context. geta ( ) -> getvalue ( ) << std:: endl;
return 0 ;
}
小结
题外话:C++适当用宏!适当用宏!适当用宏! 如有错误,欢迎指出!