You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 22:24:04