【问题标题】:Mark a single member as private将单个成员标记为私有
【发布时间】:2016-10-17 20:16:23
【问题描述】:

在 C++ 中,我正在使用一个宏,我需要在其中定义两个变量,其中第一个变量应该具有与其定义的范围相同的公共/私有/受保护状态,而另一个应该是私有的。但是,如果我这样做:

#define my_macro(a, b) int a;\
private: int b;

那么我已经永久更改了范围!这是不好的。所以我想知道:有没有办法说:“只有 this 变量/成员/方法/类是私有的”?

我天真地尝试做类似的事情

class my_class
{
   public:

   int i;
   private int j;
};

但没有运气。有什么办法可以得到我需要的吗?

编辑:我不确定宏定义的范围是公共的。正如我所说,“[...] 其中第一个应该具有与定义它的范围相同的公共/私有/受保护状态”,因此要么是公共的,要么是私有的,要么是受保护的,具体取决于范围。

【问题讨论】:

  • 您可以用同样的方式将私有后的任何内容再次声明为公开。
  • 您可以将 a 的范围作为宏的参数并在最后恢复它
  • 如果你不介意我问,这样的宏有什么意义?它似乎实现了蝙蝠的权利,使其他开发人员更难阅读您的类的代码而几乎没有明显的好处。

标签: c++ private public


【解决方案1】:

不,没有。不过有一些解决方法:

  1. 将您的变量限制为您继承的基类,并在那里使用您的宏。 (使用protected 而不是private)。

  2. 使用内部struct,采用与(1)类似的技术。

  3. 做务实的事,让宏设置成员的第一个或最后一个块。

  4. 根本不要使用宏,因为它们通常会让人头疼。

【讨论】:

    【解决方案2】:

    好吧,如果您假设“默认”范围是公共的,您可以随时将宏更改为:

    #define my_macro(a, b) int a;\
    private: int b;              \
    public:
    

    甚至:

    #define my_macro(a, b)       \
    private: int b;              \
    public:  int a;
    

    或者如果您不确定默认范围是什么,您可以随时将其添加为宏参数:

    #define my_macro(scope, a, b) int a;\
    private: int b;                     \
    scope:
    

    【讨论】:

    • OP 问题中没有任何暗示,实际上 OP 是在说:“其中第一个应该具有与其定义的范围相同的公共/私有/保护状态”
    【解决方案3】:

    语言中没有内置功能可以做到这一点。在某些编译器上,没有 pushpop 设置类似于 warning 和其他方面的预处理器。

    更大的问题是为什么?您声明类的骨架并在以后很少更改它。这不值得努力。此外,它还会降低代码的可读性和维护复杂性。

    不要在这上面浪费你的时间。我不会高效或有用。

    【讨论】:

      猜你喜欢
      • 2010-10-07
      • 2012-07-23
      • 1970-01-01
      • 2015-11-15
      • 2017-01-15
      • 2019-05-06
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      相关资源
      最近更新 更多