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

C++Strut、公共数据成员和继承

  •  1
  • celavek  · 技术社区  · 14 年前

    在某些特定的情况下,在C++类/结构中有公共数据成员是可以的吗? 这和遗产有什么关系? 我读过关于这件事的意见,有些已经在这里陈述过了

    practices on when to implement accessors on private member variables rather than making them public Accessors vs. public members

    或者在书/文章中(斯特劳斯特鲁普,迈尔斯),但我还是有点阴暗。

    我从文件中读取了一些配置块(整数、bools、float)和 我需要把它们放在一个结构中以备日后使用。我不想在外部公开这些参数,只想在另一个类中使用它们(实际上,我确实想将这些配置参数传递给另一个类,但不想通过公共api公开它们)。

    事实上,我有很多这样的配置参数(15个左右),编写getter和setter似乎是不必要的开销。另外,我有多个配置块,它们共享一些参数。让所有数据成员都公开的结构然后再进行子类化感觉不对。解决这种情况的最好办法是什么? 制作一个包含所有参数的大结构是否提供了一个可接受的折衷方案(i 对于不使用它们的块,必须将其中一些设置为它们的默认值吗?

    5 回复  |  直到 14 年前
        1
  •  4
  •   Daniel Earwicker    14 年前

    如果您有一个数据结构,它不打算有行为,但实际上只是一个纯粹的 struct 在c的意义上,特别是如果它的每个实例只在内部用于其他“适当”类的实现,那么可以将其 结构 有公共领域。毕竟,正如您所指出的,一旦为每个字段赋予了get/set访问器函数,那么无论如何,您都回到了公共数据的逻辑等价物。

        2
  •  3
  •   Stephen    14 年前

    我通常使用google的协议缓冲区编写程序配置文件。getter和setter(以及许多其他有用的函数)是为您生成的,类似于结构。它还使得编辑配置文件变得简单,允许明显的字段命名和分组。

    http://code.google.com/apis/protocolbuffers/

        3
  •  1
  •   JUST MY correct OPINION    14 年前

    如果要访问内部的类继承自主类,则设置 protected 会做你喜欢做的事。如果你想让另一个不相关的类有访问权限,你必须让它们 friend S.

        4
  •  0
  •   Paul R    14 年前

    听起来你只需要让这些成员 protected -这样,派生类可以访问它们,但它们不是公共的。

        5
  •  -1
  •   Konrad Rudolph    14 年前

    事实上,我有很多这样的配置参数(15个左右),编写getter和setter似乎是不必要的开销。

    这可以用宏来优雅地解决。这是id建议的解决方案。

    概念证明:

    #define MAKE_ACCESSOR(type, name) \
        private: \
            type _##name; \
        public: \
            type const& name() const { return _##name; } \
            void name(type const& new_value) { _##name = new_value; }
    
    …
    
    class foo {
        MAKE_ACCESSOR(int, x)
        MAKE_ACCESSOR(int, y)
    };
    
    #undef MAKE_ACCESSOR