Oat++中将DTO存入DTO列表时元素始终为NULL该如何解决
问题原因
oatpp中所有List/Map这类集合类型和自定义DTO一样,都是基于智能指针的包装类型,必须调用createShared()方法完成实例化后才能操作内部存储。你当前代码中typeDocsList直接赋值为{},等价于将智能指针初始化为空指针,后续对->运算符的调用属于空指针解引用,属于未定义行为,因此无法正常存入元素。
修正方案
把列表初始化的代码替换为实例化调用即可,完整修正后的业务代码如下:
auto dtoDoc = DocumentDto::createShared(); dtoDoc->docNumber = 0; //该值暂时为任意值 dtoDoc->typeDocNb = 3; // 修正:调用createShared()实例化列表对象,不要直接初始化为空 auto typeDocsList = oatpp::List<oatpp::Object<TypeDocDto>>::createShared(); for (int i = 0; i < dtoDoc->typeDocNb; i++) { auto typedocDto = TypeDocDto::createShared(); typedocDto->code = i; typedocDto->desciption = "foo"; typeDocsList->push_back(typedocDto); // 这里用push_back更直观,和原写法emplace效果一致 } dtoDoc->typeDocs = typeDocsList;
补充验证
你可以在赋值完成后添加如下代码验证结果是否符合预期:
// 输出列表长度,正常应该返回3 OATPP_LOGD("TEST", "list size = %d", typeDocsList->size()); // 遍历输出每个元素的code值 for(auto& item : *typeDocsList) { OATPP_LOGD("TEST", "item code = %d", item->code); }
内容的提问来源于stack exchange,提问作者Eox
相关产品推荐
相关产品推荐

