如何在具有管理器类时封装数据
How to encapsulate data when having a manager class
嗨,
我有一个名为Manager的类,它管理(创建、删除、修改等)名为Element的类的多个实例。Element类是一个非常简单的类(只是一个数据容器)。
class Manager
{
public:
void add_element(ElemKey key);
const Element *get_element(ElemKey key);
private:
container<Element> my_elements;
};
正如您所看到的,我有一个向用户返回Element的方法。我希望用户不能更改元素中的任何内容,因为这是经理的工作。
此外,我想向Manager添加一个方法,该方法可以获取Element指针和其他参数并修改Element。
我可以获取元素的键,而不是指针,但出于性能原因,我希望避免额外的查找。类似这样的东西:
void something_happend_to_elem_do_something(Element *elem, ...);
它的问题是,用户得到的是const指针,而不是指针,所以我或他都需要const_cast。如果我这样做,用户可能不会理解发生了什么,因为即使他给出了const*,该方法也会更改对象。此外,这似乎是一个糟糕的方法。
我想到了其他方法来解决这个问题:1.元素可以更改为:
class Element {
public:
int get_a();
private:
int a;
};
Manager类可以是Element的朋友,所以只有他才能更改它。我现在可以从Manager::get_element 中删除const
元素可以更改为:
class元素{公共:virtual~Element(){}虚拟int get_a()=0;};
在管理器cpp文件中,将创建另一个名为ElementImpl的类,只有它知道其中的数据,所以只有它才能更改它。和以前一样,我可以从Manager::get_element 中删除const
每种方法都有缺点。它们似乎都不是完美的设计。我认为只使用键而不是指针作为参数是一种更好的方法,但不幸的是,我无法腾出额外的微秒。
你们怎么想?
拥有Manager类可能有问题。因此,如果Manager只允许对所管理的元素进行一个子集的可能修改,那么您可能会返回一个Proxy:
class Proxy {
public:
Proxy(Element& e) : e(e) {}
void modification() { e.modification(); }
private:
Proxy(const Proxy&);
Proxy& operator = (const Proxy&);
Element& e;
};
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 线程数据封装最佳实践
- 数据封装实际上是如何在OOP中发生的
- 如何在具有管理器类时封装数据
- 使用并集(封装在结构中)来绕过氖数据类型的转换
- 数据复制与封装
- 将数据封装在类之外
- 封装与数据隐藏
- 将原始数据封装在类似std容器的数组中,具有运行时大小
- 在这种情况下,我如何才能保持良好的数据封装
- c++ -构造常量数据以提高性能和封装的方法
- 封装数据,使setter是私有的,getter是公共的
- 更改检测器测试、数据封装和功能运行所需的实际数据
- 对封装的数据包使用 openssl