首页 > 解决方案 > 尝试在结构中初始化联合时出错

问题描述

所以我有一个函数,它返回一个指向结构(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;
}

到现在为止还挺好。elseaparse_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 responseparse_file_error_t一部分。

我怎样才能解决这个问题?

谢谢你的帮助!

标签: c++structreturnunion

解决方案


即使我写了result->data.ok_ptr,我的编译器也会尝试将 放入unionparse_file_response_t responseparse_file_error_t一部分。

嗯,是。您将太多内容压缩到一行中,以至于您忘记了要告诉计算机做什么。

   *result = parse_files_result_t{result_tag::Ok, result->data.ok_ptr = &response};

这个声明做了几件事。(从内到外工作以跟随。我们将从开始result->data.ok_ptr = &response并工作到*result = [stuff]。)

  1. 分配responseto的地址result->data.ok_ptr
  2. 使用初始值和在步骤 1 中分配的值parse_files_result_t构造一个(临时)对象。这些值分配给and成员,因此出现错误。result_tag::Oktagdata.err_ptr
  3. 将步骤 2 中构造的对象分配给*result,覆盖在步骤 1 中完成的分配。

简化您的代码以(几乎)得到您想要的。

    result->tag = result_tag::Ok;
    result->data.ok_ptr = &response;

这提供了更多的代码行,但语法更清晰。此外,您为计算机创建的工作更少,因为它不再尝试创建临时parse_files_result_t对象。

但是,仍然存在一个问题,那就是result->data.ok_ptr悬空指针。不幸的是,我认为解决这个问题(以及解决其他问题)超出了您的问题范围。


推荐阅读