在需要解析一个对象来计算一个数据成员的值的简单情况下,我会提供一个免费函数并调用它:
int ComputeAFromFile (const string& file)
{
// MAGIC
}
class Base
{
protected:
const int a;
public:
Base(string file) : a (ComputeAFromFile (file)) {}
};
但是,当您需要解析一个对象来计算多个成员的值时,这种情况就会崩溃:
int ComputeAFromFile (const string& file)
{
// MAGIC
}
int ComputeBFromFile (const string& file)
{
// MORE MAGIC
}
class Base
{
protected:
const int a, b;
public:
Base(string file)
:
a (ComputeAFromFile (file))
b (ComputeBFromFile (file))
{
}
};
您可以这样做,而且它当然很简单(阅读:易于理解和维护),但在必须两次解析同一个文件方面也很昂贵。
所以相反,我经常做的是构建一种中间对象,它在构建时解析文件一次,并缓存提取的值:
class FileParser
{
public:
FileParser (const string& file)
{
Parse (file);
}
int GetA () const { return mA; }
int GetB () const { return mB; }
private:
int mA;
int mB;
void Parse (const string& file)
{
// MAGIC HAPPENS!
// Parse the file, compute mA and mB, then return
}
};
现在,它可以采用 a ,而不是Base
采用 a构造:string
FileParser
class Base
{
public:
Base (const FileParser& parser)
:
a (parser.GetA()),
b (parser.GetB())
{
}
};
Base 是这样构造的:
string file = ...;
Base b (FileParser (file));