我正在用C++ 11编写程序。我有一个名为MyExperiment的主类。在该类中,还有另一个类ReadFromAFile,它从文件中读取有关设置的一些信息。然后,我想使用数据初始化MyExperiment类成员的其他对象。它应该是这样的:
class MyExperiment
{
FirstObject *firstObject;
SecondObject *secondObject;
public:
MyExperiment()
{
ReadFromAFile readfromafile;
readfromafile.read();
firstObject = new FirstObject(/*some data from the readfromafile object */);
secondObject = new SecondObject(/*some data from the readfromafile object */);
}
}
每个对象(firstObject和secondObject)类都包含一些可以(应该)从文件中读取的信息以及一些其他变量和函数。我真的不想不想为每个对象类型都有两个类:一个用于可以从文件读取的数据,另一个用于其余的类。
因此,我想使用ReadFromAFile类从文件中读取一些信息,然后以某种方式将信息传递给对象的构造方法。我的问题是:正确的方法是什么?
现在,我有一些结构来描述我从ReadFromAFile类的文件中读取的数据。每种结构都引用一个对象。我还具有在MyExperiment类的构造函数中调用的getter函数:
class MyExperiment
{
FirstObject *firstObject;
SecondObject *secondObject;
public:
MyExperiment()
{
ReadFromAFile readfromafile;
readfromafile.read();
firstObject = new FirstObject(readfromafile.getFirstStruct());
secondObject = new SecondObject(readfromafile.getSecondStruct());
}
}
我认为这种解决方案不是优雅而明智的。我有一个描述我的firstObject的结构,然后使用它构造该对象的构造函数。
我不知道如何以更好的方式进行操作,因此,我将不胜感激。
我不想在myExperiment类中读取文件,因为它已经很复杂了,所以我需要进行一些加密。
有没有解决此问题的方法?
最佳答案
MyExperiment
不依赖于文件。它取决于FirstObject
和SecondObject
;其构造函数反射(reflect)出:
class MyExperiment {
public:
MyExperiment(FirstObject fo, SecondObject so)
: fo(fo), so(so) { }
private:
FirstObject fo;
SecondObject so;
};
现在,您已经删除了
MyExperiment
与First
和Second
对象的读取方式之间的所有依赖关系。现在,您可以创建一些工厂功能。例如,要从文件进行实验,您可以执行以下操作:
MyExperiment make_experiment(std::string file) {
ReadFromAFile stuff(file);
return MyExperiment(stuff.fist_object(), stuff.second_object());
}
最后,
ReadFromAFile
是一个可怕的类名。可能是指FileReader
(可能是更通用的DataSource
基类的子类)。通常,类名称应为名词,其方法应为动词。当然,您可以随意命名。但是noun
-verb
指南确实可以帮助您形成系统的定义明确的思维模型。