在特定情况下,在C ++类/结构中使用公共数据成员是否可以? 怎么会继承遗产? 我已经阅读了有关此事的意见,其中一些已在此处说明
practices on when to implement accessors on private member variables rather than making them public Accessors vs. public members
或书籍/文章(Stroustrup,Meyers),但我仍然有点阴影。
我有一些从文件中读取的配置块(整数,bools,浮点数)和 我需要将它们放入一个结构中供以后使用。我不想暴露这些外部只是在另一个类中使用它们(我实际上确实希望将这些配置参数传递给另一个类但不希望通过公共API公开它们)。
事实是我有很多这样的配置参数(大约15个),写入getter和setter似乎是不必要的开销。此外,我有多个配置块,这些配置块共享一些参数。制作一个包含所有数据成员的结构,然后进行子类化并不合适。解决这种情况的最佳方法是什么? 制作一个覆盖所有参数的大结构是否提供了可接受的折衷方案(I 将不得不将其中一些设置为不使用它们的块的默认值)?
答案 0 :(得分:4)
如果你有一个数据结构并不打算有行为但真正只是C语义中的纯struct
,特别是如果它的每个实例仅在内部用于其他实现“适当的”类,然后可以使它成为struct
并拥有公共字段。毕竟,正如您所指出的,一旦您为每个字段提供了get / set访问器函数,那么无论如何您都会回到逻辑等效的公共数据。
答案 1 :(得分:3)
我通常使用Google的协议缓冲区编写程序配置文件。为您生成getter和setter(以及许多其他有用的函数),类似于struct。它还使编辑配置文件变得微不足道,允许明显的字段命名和分组。
答案 2 :(得分:1)
如果要访问内部的类继承自主类,则设置protected
的内容将按您的喜好进行。如果您希望其他不相关的类具有访问权限,则必须将它们设为friend
。
答案 3 :(得分:0)
听起来你只需要创建这些成员protected
- 这样他们就可以被派生类访问但不公开。
答案 4 :(得分:-1)
事实是我有很多这样的配置参数(大约15个),写入getter和setter似乎是不必要的开销。
宏可以优雅地解决这个问题。这是我推荐的解决方案。
概念证明:
#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