如何在具有管理器类时封装数据

How to encapsulate data when having a manager class

本文关键字:封装 数据 管理器      更新时间:2023-10-16

嗨,

我有一个名为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

  1. 元素可以更改为:

    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;
};