代码之家  ›  专栏  ›  技术社区  ›  demoncodemonkey

如何定义在调用宏后保留其作用域的宏

  •  2
  • demoncodemonkey  · 技术社区  · 14 年前

    简化的示例,但目前我提供了一个带有公共get和私有set的属性:

    #define propertyRO(xxType, xxName)\
        property xxType xxName\
        {\
            xxType get() {return m___##xxName;}\
            void set(xxType value) {m___##xxName = value;}\
        }\
        private:\
            xxType m___##xxName;\
    

    public ref class Wawawa
    {
    public:
        int bob;
        propertyRO(String^, MyName);
    };
    

    这可能会很好地工作,但它是有缺陷的,因为成员是在私有范围中指定的,这意味着在宏也获得私有范围之后发生的任何事情。例如:

    public ref class Wawawa
    {
    public:
        int bob;
        propertyRO(String^, MyName);
        int fred; //ERROR HERE <- this would be private not public
    };
    

    如果忽略这个宏的实际作用,我真正的问题是:有没有办法使用 private: 关键字,而不影响类的其他部分?

    4 回复  |  直到 10 年前
        1
  •  2
  •   Danvil    14 年前

    在类定义的末尾一起插入属性宏调用。(我同意,这个答案有点蹩脚;)

        2
  •  2
  •   AshleysBrain    14 年前

        3
  •  2
  •   demoncodemonkey    14 年前

    我觉得这是不可能的。

    publicPropertyRO 很明显,这将创造一个公共财产。并将私有成员移动到属性声明上方:

    #define publicPropertyRO(xxType, xxName)\
        private:\
            xxType m___##xxName;\
        public:\
            property xxType xxName\
            {\
                xxType get() {return m___##xxName;}\
                void set(xxType value) {m___##xxName = value;}\
            }\
    

    public: 我认为这是可以接受的。

        4
  •  2
  •   Community CDub    7 年前

    Demoncodemonkey's suggestion 是将public嵌入到函数名中(可以),但另一种方法是将宏后面的作用域作为参数。例如。

    #define propertyRO(xxType, xxName, xxFollowingScope)\
        property xxType xxName\
        {\
            xxType get() {return m___##xxName;}\
            void set(xxType value) {m___##xxName = value;}\
        }\
        private:\
            xxType m___##xxName;\
        xxFollowingScope:
    

    ...

    public ref class Wawawa
    {
    public:
        int bob;
        propertyRO(String^, MyName, public);
        int fred; // No error here, fred is public
    };