假设我有一个Class Foo,它具有许多内部变量,只有一个构造函数和非修改方法。
内部变量值的计算涉及状态变量和复杂函数,因此不应作为Foo的一部分。因此,我创建了一个执行微积分的FooCreator类,最后创建了Foo。

首先,我在FooCreator中单独实现了创建Foo所需的所有成员变量,并添加了createFoo()函数,但最后,FooCreator几乎变成了Foo的副本,外加了一些状态变量。

接下来,我决定让FooCreator从Foo继承,这样可以节省很多打字时间,但是
因为获得了东西,这只是感觉不干净的解决方案。我必须使Foo的成员变量 protected 而不是私有(private),因此向其他用户公开了比我想要的更多的内容。 Foo除创建外,不应用作基类。

我看了看工厂模式,但是那看起来和制造商一样都过分了。
当然,这个问题将非常普遍。那么解决这个问题的正确方法是什么?

一些代码示例如下所示:

class Foo{
    private: //protected for second case
      int mVal;
      State mState;
      ComplexStuff mStuff;
      //...

    public:
      Foo():mVal(),mState(),mStuff(){}
      Foo(int val, State const& state, ComplexStuff const& stuff):
        mVal(val),mState(state),mStuff(stuff){}
      bool loadFromFile();

      bool evalStateTransition(State const& formerState) const{/*....*/}
      bool someTest(int) const{/*....*/};
      GraphicItem* visualize() const{/* ....*/};
      //...
  };

  class FooCreator{
    private:
      int mVal;
      State mState;
      ComplexStuff mStuff;

      StuffVisualizer mStuffVis;
      Paramset mParams;
      //...

    public:
      FooCreator(Paramset const& set):
        mVal(),mState(),mStuff(),mStuffVis(),mParams(set){}
      constructState(int, int, int);
      gatherStuff1(File file1);
      Foo createFoo();

      int evalStateTransition(State const& formerState)  const{
        /*same long code as in Foo*/
      }
      bool someTest(int) const{ /*same long code as in Foo*/}
      GraphicItem* visualize() const{ /*same long code as in Foo*/}
      //...
  };

  class FooCreator2 : public Foo{
    private:
      StuffVisualizer mStuffVis;
      Paramset mParams;
      //...

    public:
      FooCreator(Paramset const& set):Foo(),mParams(set){}
      constructState(int, int, int);
      gatherStuff1(File file1);
      Foo createFoo();
  };

最佳答案

只需在Foo中编写friend class FooCreator;,现在您就可以从FooCreator访问Foo的所有私有(private)字段。然后只需在FooCreator中创建一个类型为Foo的字段即可。

关于c++ - 用于将对象创建与其类分开的模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8231955/

10-10 08:34