仅对一个成员使用C++访问修饰符

3

我试图使在C++中生成setter和getter更加方便。现在,我想出了这个:

#define getterAndSetter(t, vn, fn) \
    t vn; \
    t get##fn() { \
        return vn; \
    } \
    void set##fn(t val) { \
        vn = val; \
    }

所以,问题在于现在我在同一个访问控制级别(public/private)中有变量和getter。我可以在那里写public:和private:,但是这样我会失去前后代码的上下文。问题是我能否为单个成员获取访问修饰符,就像Java中一样?


2
我认为可以移除 setter 和 getter 方法,因为如果它们只是用来获取和设置数据成员的话,那么似乎没有什么好的理由保留它们。 - juanchopanza
4
如果您真的打算使用这个,那么您的类设计不好。如果您的数据具有不变性,那么那些set/get操作无法胜任其工作,如果没有,那么请使用一个聚合对象。如果您两者都有,那么您的类太大并违反了单一职责原则。(除非您有一个特殊的奇怪情况需要这样做,但是这很可能不是您的情况)。 - Baum mit Augen
我的意思是,当然,我不会完全使用那样的代码,我需要在设置之前检查值的setter,但我发现我使用的类有太多字段,它可能实际上违反了单一职责原则。无论如何,谢谢。 - ionagamed
这只是一个非常非常糟糕的想法。你很少需要一个具有直接getter和setter的成员变量;你可以将变量设置为public,这样也不会有太大的区别。 - Christian Hackl
如果你想使生成setter和getter更加方便(正如其他人所指出的那样,这本来不应该是很常见的),为什么不使用集成开发环境(IDE)呢?Eclipse可以轻松自动生成setter和getter的存根。 - Nir Friedman
显示剩余2条评论
3个回答

2

不要使用宏。那么您可以将所有内容放在任何您想要的访问中。即使是没有意义的访问:

class MyClass {
public:
    T var;
private:
    T getVar() { return var; }
protected:
    void setVar(const T& v) { var = v; }
};

更进一步的优点是,每个阅读我刚刚写的内容的人都能很快地理解它的作用。使用宏会使本应简单的代码变得混乱和不合理复杂。

我同意 - +1 - 只需避免使用宏,因为它们是坏消息。 - Ed Heal
如果我在同一行的每个类成员和方法前面添加访问修饰符,会有什么不利之处吗? - ghchoi

2
抱歉,没有。C++使得这种情况依赖于上下文。

0

不可以,而且我不愿意提供一些设计有问题的代码。

首先,使用宏来做这样的工作真的是一个很糟糕的想法。如果你真的想要一个宏,请尝试以下代码(在退出时默认为私有,这是最安全的行为,但仍然需要注意宏的安全性):

#define MyMacroProperty(t, fn, visibilitygetter, visibilitysetter) \
    visibilitygetter :         \
    t get##fn() {              \
        return _##fn;          \
    }                          \
    visibilitysetter:          \
    void set##fn(t val) {      \
    _##fn = val;               \
    }                          \
    private:                   \
    t _##fn;             

例子

class Foo{
    MyMacroProperty(int, foo, public, protected);

public:

    Foo(): _foo(3) {}
};

请注意,这种方法存在各种缺陷: 您无法在属性内部插入其他逻辑(基本上只是设置/返回值)。唯一有意义的情况可能是创建一个公共/受保护的 setter 和一个私有 getter(这只是为了节省一些打字时间),但这被宏替换所取代。
然而,如果您真的想要像 C++ 中的属性一样的东西,可以使用模板来实现(需要非平凡的 C++ 技能): http://www.codeproject.com/Articles/3900/Implementing-Properties-In-C 通过这种方式,您至少有机会使用函数对象插入其他逻辑(笨拙的语法,只需手动编写 getter 和 setter)。基本上,setter/getter 是语法糖,因此如果编译器无法为您完成,则试图欺骗是适得其反的。

From: http://www.joelonsoftware.com/articles/Wrong.html

不要使用宏来创建自己的个人编程语言。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接