看着这个答案,我知道你不应该像我在我的程序中那样使用 C++ 中的友谊来复制私有指针:
class bar;
class foo
{
private:
some_smart_pointer<int> state;
public:
foo(int value) : state(new int(value)) {}
friend class baz;
};
class bar
{
private:
some_weak_pointer<int> state;
public:
friend class baz;
};
class baz
{
public:
foo Foo;
bar Bar;
baz() { Bar.state = Foo.state; }
};
没关系,但是传递一个常量智能指针违反了封装原则。
它暴露了系统的内部。将 bar 传递给 foo 也会产生耦合。同样在我的系统中,将对象聚合到该问题中所谓的流畅界面是有意义的:
MainObject.PropertyCollection.Property
正如在那个 SO 答案中所说的那样,它不违反得墨忒耳定律,还是吗?
我在这里非常困惑。
我正在最后一次重新设计我的图书馆,我希望它是正确的。
我认为与其传递我的内部智能指针,不如传递一个包装类,该类也将用作属性并将其设置为只读,然后复制是安全的,对吧?
根据评论进行编辑:嗯,我正在实施 D20 3.5 SRD ( http://www.d20srd.org/ )。
例如,有六种能力。
在我的设计中,D20Abilities 聚合在 D20Character 中。
D20Abilities 包含 6 个 D20Ability 实例:力量、敏捷、体质。智慧、智慧和魅力。
所有 D20Ability 实例都拥有一个在整个系统中共享的私有状态(称为修饰符)。例如,每个技能都需要自己的技能修饰符。