如何在拥有经理类时封装数据

时间:2014-02-25 16:14:06

标签: c++ oop


您好,

我有一个名为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 Element { 上市:     虚〜元素(){}     virtual int get_a()= 0; };

  2. 在manager cpp文件中,将创建另一个名为ElementImpl的类,只有它知道其中的数据,因此只有它可以更改它。 像以前一样,我可以从Manager :: get_element

    中删除const

    每种方法都有缺点。 他们似乎都不是完美的设计明智。 我认为只使用键作为参数而不是指针将是一种更好的方法,但遗憾的是我无法节省额外的微秒。

    你们觉得怎么样?

1 个答案:

答案 0 :(得分:0)

拥有一个Manager类可能会有问题。因此,让Manager只允许对托管元素进行可能修改的子集,您可以返回代理:

class Proxy {
   public:
   Proxy(Element& e) : e(e) {}
   void modification() { e.modification(); } 
   private:
   Proxy(const Proxy&);
   Proxy& operator = (const Proxy&);
   Element& e;
};