加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 指向成员的指针上的const_cast是否安全?

发布时间:2020-12-16 07:09:39 所属栏目:百科 来源:网络整理
导读:在下面的代码中,对象的非const方法调用同一对象的const方法,该方法返回一个指向对象字段的const指针,然后将此返回的指针转换为非const版本 – 这是一种技术类似于这个答案中的一个: Elegant solution to duplicate,const and non-const,getters? .但是,由于
在下面的代码中,对象的非const方法调用同一对象的const方法,该方法返回一个指向对象字段的const指针,然后将此返回的指针转换为非const版本 – 这是一种技术类似于这个答案中的一个: Elegant solution to duplicate,const and non-const,getters? .但是,由于我将指针放入复杂的数据结构中,我不确定它是否真的有效.会吗?

class Struct {
private:
    Field f,g;

    std::map<std::string,const FieldBase*> const_fields_t;
    std::map<std::string,FieldBase*> fields_t;

public:
    const_fields_t get_fields() const {
        return const_fields_t { { "f",&f },{ "g",&g } };
   }

   fields_t get_fields() {
        const Foo* = this;
        fields_t result;

        foreach(auto& v : const_this->get_fields()) {
            result[v->first] = const_cast<FieldBase*>(v->second);
        }
        return result;
   }
};

解决方法

是的,(我清理了你的代码):

#include <string>
#include <functional>
#include <iostream>
#include <map>
using namespace std;

class FieldBase {public: virtual string get_data() = 0; };
class Field : public FieldBase { public: string data; virtual string get_data() { return data; } };

class Struct {
public:
    Field f,g;

    typedef std::map<std::string,const FieldBase*> const_fields_t;
    typedef std::map<std::string,FieldBase*> fields_t;

public:
    const_fields_t get_fields() const {
        cout << "const get_fields() called" << endl;
        return const_fields_t { { "f",&g } };
   }

   fields_t get_fields() {
        cout << "non-const get_fields() called" << endl;
        auto const_this = static_cast<const Struct*>(this);
        fields_t result;

        for(auto& v : const_this->get_fields()) {
            result[v.first] = const_cast<FieldBase*>(v.second);
        }
        return result;
   }
};

int main ()
{
    Struct a;
    a.f.data = "Hello";
    a.g.data = "World";

    Struct::fields_t obj = a.get_fields();

    cout << obj["f"]->get_data() << endl;
    cout << obj["g"]->get_data() << endl;

}

Live example

你基本上有const函数就像一个网关来获取你需要的值,然后抛弃constness.这也适用于您的目的,因为指针将被解除并存储在新地图中.

请记住,可能有一个更好的解决方案,不涉及所有上述复制.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读