我在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 课程中阅读该文件,因为它已经很复杂,所以我需要一些帮助。
此问题是否有解决方法?
答案 0 :(得分:3)
MyExperiment
不依赖于文件。这取决于FirstObject
和SecondObject
;让它的构造函数反映出:
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
指南确实可以帮助您形成系统明确定义的心理模型。
答案 1 :(得分:1)
在我看来,你想要一个Factory。为了不重复自己并删除'结构',你可以让你的Reader类只构造对象,比如
firstObject = readfromafile.NewFirstObject();
secondObject = readfromafile.NewSecondObject();
然后你可以声明Reader FirstObject和SecondObject的朋友,并将他们的构造函数设为私有,但实际上并不需要。
答案 2 :(得分:0)
如果你真的不想定义单独的类并且(我假设那样)你几乎没有初始化策略,那么我宁愿制作一个构造函数来获取枚举来选择初始化策略,如:
typedef enum _Strategy
{
STRATEGY_A = 1,
STRATEGY_B
}
class MyExperiment
{
FirstObject *firstObject;
SecondObject *secondObject;
public:
MyExperiment()
{
firstObject = new FirstObject(STRATEGY_A);
secondObject = new SecondObject(STRATEGY_B);
}
}
根据给定的策略进行文件读取和初始化为@H。古吉特在评论中写道。