我发现了一段代码如下。
#define READWRITE READWIRTE
#define READWIRTE(varType, varName, funName) \
private: varType varName; \
public: varType get##funName(void) const { return varName; }\
public: void set##funName(varType var){ varName = var; }
READWIRTE(int, mSessionId, SessionId)
我想知道为什么不以正常形式定义函数。我的意思是,像这样:
private:
int mSessionId;
public:
public int getSessionId() const;
public void setSessionId(int sessionId);
然后定义这两个函数。
我应该何时使用预处理程序指令?
答案 0 :(得分:2)
这个宏将确保每个变量都正确定义了它的setter和getter。
这将有助于您的开发人员认为每次编写变量,getter和setter都是浪费时间的情况。他可以简单地称这个宏。这对于进行代码审查的人来说会更容易,因为如果你想要setter和getter,他/她会知道会发生什么(在这种情况下它会是宏)。
答案 1 :(得分:2)
如@ user258367所说,这个宏可以帮助你用public getter和setter声明私有字段。
如果您拥有大量的那些并且没有为您执行低级编码的IDE,那么它可以是一个选项,因为:
READWIRTE(int, mSessionId, SessionId)
比完整代码更简洁。
但除非它是企业环境中的常见用法,并且包含在许多项目中共享的.h
中,否则我不会使用它:
它会在public:
可见性中隐含地让您感到困惑
private:
int foo; // private, no need for getter or setter
READWIRTE(int, mSessionId, SessionId);
double bar; // is public !
public:
void othermethod();
...
答案 2 :(得分:1)
这似乎是一个用于生成"属性的宏#34;在课堂上。作者最有可能将其用作快捷方式,而不是手动输入私有成员/访问者/变种人。
答案 3 :(得分:1)
我认为使用宏有两个很好的理由:
就像这里一样,作为避免繁琐输入的简写;
当你不想在额外的函数中包装非可移植的构造(函数调用)时,确保代码在不同平台或代码的不同变体之间的可移植性。
答案 4 :(得分:1)
代码看起来旨在为用户提供简单地向类添加属性的简写。乍一看,它似乎是防止不必要打字的有用捷径。但是,由于以下原因,简单地在成员函数中添加getter和setter可能并不总是最好的路径。
setSessionId()
在任何地方都找不到它。尽管可以通过宏实现此目的,但使用宏的normal warnings适用。在结束这条路线之前,结论是要三思而后行。