我正在用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不依赖于文件。它取决于FirstObjectSecondObject;其构造函数反射(reflect)出:

class MyExperiment {
  public:
    MyExperiment(FirstObject fo, SecondObject so)
     : fo(fo), so(so) { }
  private:
    FirstObject fo;
    SecondObject so;
};

现在,您已经删除了MyExperimentFirstSecond对象的读取方式之间的所有依赖关系。

现在,您可以创建一些工厂功能。例如,要从文件进行实验,您可以执行以下操作:
MyExperiment make_experiment(std::string file) {
 ReadFromAFile stuff(file);
 return MyExperiment(stuff.fist_object(), stuff.second_object());
}

最后,ReadFromAFile是一个可怕的类名。可能是指FileReader(可能是更通用的DataSource基类的子类)。通常,类名称应为名词,其方法应为动词。当然,您可以随意命名。但是noun-verb指南确实可以帮助您形成系统的定义明确的思维模型。

10-08 15:53