【问题标题】:Macro "parameter" name mesh. Can it work? What am I doing wrong?宏“参数”名称网格。它可以工作吗?我究竟做错了什么?
【发布时间】:2011-07-31 20:16:34
【问题描述】:
    // MACROS

#define A_PROPERTY(TYPE, NAME)                      \
    private:                                        \
        TYPE NAME;                                  \
    public:                                         \
        void SetNAME(TYPE theNAME) {NAME=theNAME;}  \
        TYPE GetNAME() {return NAME;}               \

我正在尝试创建一个简单的宏,它将采用 TYPE 和 NAME 并将创建:

  1. 名为 NAME 的 TYPE 的私有成员
  2. 名为 GetNAME 的公共“getter”方法(其中 NAME 是变量...)
  3. 名为 GetNAME 的公共“setter”方法(其中 NAME 是变量...)

这是我从类定义中使用它的方式:

A_PROPERTY(int, Age)

MACRO 可以工作,但会创建一个“getNAME”方法而不是“get(whatever I put in NAME)”。似乎 MACROS 不能很好地同时解析字符串和“参数”。有没有办法实现我想要的?还是应该只使用具有不同签名的“NAME”方法来区分get和set?

【问题讨论】:

  • 这是我见过的最恶心的东西。
  • 也许令人反感,但至少它是可读的......
  • 我希望我没有给你造成永久性伤害,DeadMG...
  • 好吧,我的好奇心战胜了我的讽刺——上面的问题有什么令人恶心或反感的地方?

标签: c++ macros


【解决方案1】:

Use ## 缝合令牌。

#define A_PROPERTY(TYPE, NAME)                            \
    private:                                              \
        TYPE NAME;                                        \ 
    public:                                               \
        void Set##NAME(TYPE the##NAME) {NAME=the##NAME;}  \
        TYPE Get##NAME() {return NAME;}

【讨论】:

  • 啊哈!而已。谢谢。这就是我要找的胶水。
【解决方案2】:
void SetNAME(TYPE theNAME) {NAME=theNAME;}  
TYPE GetNAME() {return NAME;}              

这将为所有 NAME 和 TYPE 参数创建相同的函数名称。

我想你想要这个:

void Set##NAME(TYPE the##NAME) {NAME=the##NAME;}  
TYPE Get##NAME() {return NAME;}               

【讨论】:

    【解决方案3】:

    NAME 并不是真正私有的,因为您可以通过成员函数对其进行读写。您不妨使用struct,或公开NAME

    【讨论】:

    • 不,它确实私有的,因为它位于private: 部分中。像这样创建访问器是一个标准的习惯用法。
    • @Richard Standard idiom 是的,但是如果我们正在构建一个聚合 - 看起来像这样 - struct 更合适。这种宏观方法在很多层面上都是令人讨厌的。至少使用模板。
    • 我很好奇,为什么是结构?我已经有一个类,我只想轻松添加一个成员+访问器方法。为什么要定义外部结构?
    • @Ron 你需要这个宏的事实表明你有很多成员都有读/写访问器。此外,get/set 没有添加任何值(例如检查值、在 set 上执行进一步操作或在 get 上计算某些东西等)从我看到的你的课程来看,它看起来像是未连接数据值的聚合,struct 是很适合这个。
    • 知道了,是的。确实有道理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多