我有一个数据结构,有两个类访问它:
class Foo {
public:
void set(double foo);
double get();
};
class FooWriter {
Foo bar;
void setFoo() { bar.set(42); }
};
class FooReader {
Foo *baz;
double getFoo() { return baz->get(); }
};
我想限制FooReader读取Foo,并且只允许为FooWriter设置。私有集函数和朋友类是一个选项但不幸的是我有很多FooWriter的子类,并且由于友谊不能被继承,我不想将它们全部列为朋友。在朋友FooWriter超类中使用受保护方法绕过封装是另一种选择:
class Foo {
void set(double foo);
public:
double get();
friend class FooWriter;
};
class FooWriter {
Foo bar;
protected:
void setFooBackdoor(double value) { bar.set(value); }
};
class subFooWriter {
void setFoo() { setFooBackdoor(42); }
};
但有些人会认为这是糟糕的设计。我还在这里读到,如果你需要友谊继承,你的设计中有一个缺陷,所以我很好奇,这个问题的正确解决方案是什么。