gpt4 book ai didi

c++ - 在 C++ 中填充 map 容器时的多态设计

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:29 24 4
gpt4 key购买 nike

我不擅长 OOP 设计,但我需要向潜在雇主展示我的知识。情况如下:

我有一个包含键值类型参数的文件,名为 parameters.txt .我有一个 map <string, CommonParamValue>作为容器。我需要用元素填充它,使用带参数的文件。 key 始终是 std::string参数,CommonParamValue可以用 int 表示, double , string和一个标准的函数调用。为了实现这一点,CommonParamValue是具有虚方法的基类。它有 child - StringParamValue , DoubleParamValue , CurTimeParamValue .基类和每个 child 都有一个方法virtual string GetValue()返回内部数据的字符串表示; virtual void SetValue(string)设置值。

问题是如何填充容器map <string, CommonParamValue>使用多态性在运行时使用适当的数据?现在我遇到了这样的情况:

参数.txt

*user_name=Jane
*order_number=1325
current_date=

填充 map 的例程

ifstream in(fileParamsPath);
if (! in)
{
cout << "Cannot open file with parameters, program is terminating." << endl;
cin.get();
exit(-1);
}
string key = "", value = "";
while(in)
{
getline(in, key, '=');
getline(in, value, '\n');

// put key and value into the container
// right here we need to analyze the data type and choose appropriate container.
// CommonParamValue *paramValue = new DoubleParamValue(); or
// CommonParamValue *paramValue = new CurTimeParamValue(); or
// CommonParamValue *paramValue = new StringParamValue();

paramValue->SetValue(value);
params.insert(make_pair(key, *paramValue)); // params is a map <string, CommonParamValue>
delete paramValue;
}
in.close();

有一个想法是将值参数的类型保存在文件 parameters.txt 中。填充时分析map <string, CommonParamValue>

参数.txt

*user_name=Jane
string

*order_number=1325
int

current_date=
function

并修改填充例程map <string, CommonParamValue>这样:

string key = "", value = "", type = "";
while(in)
{
getline(in, key, '=');
getline(in, value, '\n');
getline(in, type, '\n');
in.get(); // got the dividing empty string
// put key and value into the container
// right here we need to analyze the data type and choose appropriate container.
if(type == "int")
{
CommonParamValue *paramValue = new IntParamValue();
}
else if(type == "function")
{
CommonParamValue *paramValue = new CurTimeParamValue();
}
else if(type == "string")
{
CommonParamValue *paramValue = new StringParamValue();
}
else
{
// error
exit(1);
}

paramValue->SetValue(value);
params.insert(make_pair(key, *paramValue)); // params is a map <string, CommonParamValue>
delete paramValue;
}

这是一个好决定还是坏决定?也许我的潜在雇主希望我以其他方式实现它,但我只有这个决定。对于初级 C++ 程序员,还有更好的吗?

最佳答案

最经典的应用设计是factory method design .

CommonParamValue* createParamValue( const std::string &value );

createParamValue 方法负责创建适当的派生 ParamValue 并将其作为 CommonParamValue 返回。

通过在 createParamValue 中使用值字符串推断类型,您可以避免将额外的“类型”字符串注入(inject) parameters.txtregular expression intdoubleCurTime 听起来是最优雅的。 Boost regex是一个示例库,可让您在 C++ 中执行此操作。但当然,如果您正在寻找快速解决方案,那么编写自己的 30 行决策树对于这些简单的语法应该不是问题。

关于c++ - 在 C++ 中填充 map 容器时的多态设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11096950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com