您好,
我有一个名为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 Element { 上市: 虚〜元素(){} virtual int get_a()= 0; };
在manager cpp文件中,将创建另一个名为ElementImpl的类,只有它知道其中的数据,因此只有它可以更改它。 像以前一样,我可以从Manager :: get_element
中删除const每种方法都有缺点。 他们似乎都不是完美的设计明智。 我认为只使用键作为参数而不是指针将是一种更好的方法,但遗憾的是我无法节省额外的微秒。
你们觉得怎么样?
答案 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;
};