将const参数的const char *成员分配给新值

时间:2017-04-25 14:14:35

标签: c++ casting const

我正在处理第三方库,我想在代码中修改结构。

有第三方结构

struct structure {
    const char *c;
    // ...
};

我有一个功能

void prep(const structure *s) {
    std::string str("hello");
    const char *t_c = s->c;
    s->c = str.c_str(); // structure::c is a const char *
    handle(s); // makes use of overriden c
    s->c = t_c; // Set back in case library tries to free/use memory later
}

我如何在这里进行适当的const转换?

1 个答案:

答案 0 :(得分:2)

我假设handle被声明为void handle(const structure*);

最简单的解决方案是复制s,修改副本,然后将其传递给handle。由于sconst,您知道无法对需要传播到原始s的副本进行任何更改。您还无需将s->c重置为原始值。

void prep(const structure *s) 
{
    structure mycopy(*s); // Make a copy of s
    std::string str("hello");
    mycopy.c = str.c_str(); // structure::c is a const char *
    handle(&mycopy); // makes use of overriden c
}

如果您无法复制structure,请考虑删除const的{​​{1}}说明符来修改您的函数声明。如果你只是删除s,你会得到以下编译好的函数。请注意,生成的函数不是异常安全的。如果const引发异常,您将无法将handle成员重置为其原始值。

s->c

如果其他所有方法都失败了,您可以使用const_cast作为最后的手段。请确保void prep(structure *s) { std::string str("hello"); const char *t_c = s->c; s->c = str.c_str(); // structure::c is a const char * handle(s); // makes use of overriden c s->c = t_c; // Set back in case library tries to free/use memory later } 未指向实际为s的实例,并确保在const未处于原始状态时不会引发异常。被迫使用s可能是糟糕的设计决策的一个指标。

const_cast