c++ - 尝试在结构中初始化联合时出错
问题描述
所以我有一个函数,它返回一个指向结构(parse_files_result_t*
)的指针。这个结构包含一个联合:
struct parse_files_result_t{
result_tag tag;
union {
struct parse_file_error_t *err_ptr;
struct parse_file_response_t *ok_ptr;
} data;
};
我想根据函数中的计算使用联合返回一个*err_ptr
或一个。*ok_ptr
所以我写了以下代码:
parse_files_result_t* result = (parse_files_result_t*)malloc(sizeof (parse_files_result_t));
if (success) {
parse_file_response_t response = //data
*result = parse_file_result_t{result_tag::Ok, result->data.ok_ptr = &response};
return result;
} else {
parse_file_error_t errorresponse = //data
*result = parse_files_result_t{{result_tag::Err}, {result->data.err_ptr = &errorresponse}};
return result;
}
到现在为止还挺好。else
aparse_file_error_t
返回的部分工作正常,因为parse_file_error_t
是联合的第一部分。在该if
部分中,我只想返回parse_file_response_t
. 因为这是联合的第二个“部分”,所以我收到此错误:
错误:无法在初始化中将 'parse_file_response_t*' 转换为 'parse_file_error_t*'
即使我写了result->data.ok_ptr
,我的编译器也会尝试将 放入unionparse_file_response_t response
的parse_file_error_t
一部分。
我怎样才能解决这个问题?
谢谢你的帮助!
解决方案
即使我写了
result->data.ok_ptr
,我的编译器也会尝试将 放入unionparse_file_response_t response
的parse_file_error_t
一部分。
嗯,是。您将太多内容压缩到一行中,以至于您忘记了要告诉计算机做什么。
*result = parse_files_result_t{result_tag::Ok, result->data.ok_ptr = &response};
这个声明做了几件事。(从内到外工作以跟随。我们将从开始result->data.ok_ptr = &response
并工作到*result = [stuff]
。)
- 分配
response
to的地址result->data.ok_ptr
。 - 使用初始值和在步骤 1 中分配的值
parse_files_result_t
构造一个(临时)对象。这些值分配给and成员,因此出现错误。result_tag::Ok
tag
data.err_ptr
- 将步骤 2 中构造的对象分配给
*result
,覆盖在步骤 1 中完成的分配。
简化您的代码以(几乎)得到您想要的。
result->tag = result_tag::Ok;
result->data.ok_ptr = &response;
这提供了更多的代码行,但语法更清晰。此外,您为计算机创建的工作更少,因为它不再尝试创建临时parse_files_result_t
对象。
但是,仍然存在一个问题,那就是result->data.ok_ptr
悬空指针。不幸的是,我认为解决这个问题(以及解决其他问题)超出了您的问题范围。
推荐阅读
- angular - 创建带有排序和过滤选项的表
- javascript - 全部或部分在 TypeScript 中模拟类和接口
- c# - 如何在代码后面/ XAML中获取x:元素的名称
- python - 列表理解中的多个 if 条件
- mysql - How to use "ON UPDATE CASCADE" Correctly in MariaDB 10.1.37 / Ver 15.1?
- java - 简单的歌曲列表,使用数组列表和对象
- jquery - jQuery: Exclude the first and second columns that is VISIBLE
- mongodb - 仅从 mongoose 组/聚合操作返回原始文档
- objective-c - NSUndoManager is undoing all changes done during a mouseDrag with single Undo
- fullcalendar - fullcalendar events not displayed after next