假设我有一个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/