Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/machine-learning/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 友谊继承用例的替代方案_C++_Inheritance_Friend - Fatal编程技术网

C++ 友谊继承用例的替代方案

C++ 友谊继承用例的替代方案,c++,inheritance,friend,C++,Inheritance,Friend,我有一个数据结构,有两个类访问它: 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

我有一个数据结构,有两个类访问它:

   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的设置。私有集函数和friend类将是一个选项,但不幸的是,我有很多FooWriter的子类,而且由于友谊不能被继承,我不想把它们都列为朋友。使用friend 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); }
   };

有些人会认为这是一个糟糕的设计。我在这里也读到,如果你需要友谊传承,你的设计中有一个缺陷,所以我很好奇,这个问题的正确解决方案是什么

Foo在实际的代码中有成员,但我将它们移出以获得一个简短的示例。