有关于下面设计的c ++代码片段的两部分问题:
namespace {
struct FieldRecord {
string item_to_fieldname;
bool is_queriable;
};
const FieldRecord g_LookUpTable [] = {
{"employee_name", true},
{ "ssn_no", false},
//etc
};
}
1)如果我想实现一个非-pod结构的查找表,则下面的C样式方法容易出错,或者是否需要使结构FieldRecord成为pod,即用const char * etc替换字符串
2)上述结构中数组的FieldRecord结构是如何从初始化列表初始化的,因为我只有一个默认的构造函数。
答案 0 :(得分:2)
您的代码运行正常。对结构进行初始化按照惯例进行:每个元素的每个数据成员都是从相应的参数构造的,从string
构造char*
完全有效。
答案 1 :(得分:1)
您的FieldRecord不是POD。然而,它是一个聚合。要使用直接初始化,就可以使用聚合。如果您的类型变为非聚合,则需要使用构造函数。对于聚合,您只需列出相应成员应获得的值,它们将直接初始化,可能涉及成员的转换。
然后问题变成:什么是聚合?好吧,它是任何既没有构造函数也没有析构函数的类,没有私有或受保护的非静态数据成员,没有基类,也没有虚函数。如果你需要其中任何一个,你需要给你的类型一个构造函数并从那里构造。它有点重复,但您仍然可以使用这些对象填充数组。例如:
std::pair<std::string, bool> const table[] = {
std::pair<std::string, bool>("employee_name", true),
std::pair<std::string, bool>("ssn_no", false)
};