获取非侵入式升级序列化C的私有数据成员

获取非侵入式升级序列化C的私有数据成员,第1张

概述我尝试为我的非成员serialize()函数提供A类的getter,因为从成员访问是私有的. template<typename T>class A{public: A(const T& id) : m_id(id) {} T& getRef() { return m_id; } // not giving good results T getId() { return m_ 我尝试为我的非成员serialize()函数提供A类的getter,因为从成员访问是私有的.
template<typename T>class A{public:  A(const T& ID) : m_ID(ID) {}  T& getRef() { return m_ID; } // not giving good results  T  getID()  { return m_ID; } // not giving good results  const T& getRef() const { return m_ID; } // not giving good resultsprivate: // I would like to keep it private  T m_ID;}namespace boost { namespace serialization {template<class Archive,typename T>voID serialize(Archive &ar,A &a,const unsigned int version){    // ar &BOOST_SERIAliZATION_NVP(a.m_ID); // I would like to avoID that it works if m_ID is public    ar &BOOST_SERIAliZATION_NVP(a.GetRef()); // I want this !}}}// and later I usestd::ofstream ofs("test.xml");boost::archive::xml_oarchive oa(ofs);A<int> a(42);oa << BOOST_SERIAliZATION_NVP(a);

不幸的是,执行时一直告诉我类型为boost :: archive :: xml_archive_exception的未捕获异常 – 当我尝试使用getList(GetRef()或GetID()时,无效的XML标记名称.
如果我公开时直接访问m_ID,它的效果很好.

这样做有什么好方法吗?

解决方法 >你可以使用老朋友:

Live On Coliru

template <typename T>class A {  public:    A(const T &ID) : m_ID(ID) {}  private:    template <typename Ar,typename U> frIEnd voID boost::serialization::serialize(Ar&,A<U>&,const unsigned);    T m_ID;};namespace boost {namespace serialization {    template <class Archive,typename T>    voID serialize(Archive &ar,A<T> &a,const unsigned int)    {        ar & BOOST_SERIAliZATION_NVP(a.m_ID);    }}}

>您可以使用getRef()方法.这个

>不需要朋友(少打扰)
>需要make_nvp(因为您不能使用a.getRef()作为XML元素名称

Sadly,having the reference getter break encapsulation in a horrific way. I’d personally prefer to have m_ID public in the first place,instead.

Live On Coliru

template <typename T>class A {public:    A(const T &ID) : m_ID(ID) {}    T& getRef()             { return m_ID; }     T const& getRef() const { return m_ID; } private:    T m_ID;};namespace boost {namespace serialization {    template <class Archive,const unsigned int)    {        ar & boost::serialization::make_nvp("m_ID",a.getRef());    }}}

奖励积分:
>您可以使用’pimpl’样式结构.您可以在A<>内转发声明一个结构:

template <typename T>class A {public:    struct access;    A(const T &ID) : m_ID(ID) {}private:    T m_ID;};

这比getRef()方法更少侵入,getRef()方法只是简单地破坏了封装.现在,您可以隐藏此类中的私有访问:

namespace boost {namespace serialization {    template <class Archive,const unsigned int version)    {        A<T>::access::serialize(ar,a,version);    }}}

当然,您仍然需要实现它,但这可以在单独的标题中完成,并且不会影响A类<> (或其任何专业):

template <typename T>struct A<T>::access {    template <class Archive>    static voID serialize(Archive &ar,const unsigned int) {        ar & BOOST_SERIAliZATION_NVP(a.m_ID);    }};

另见Live On Coliru

总结

以上是内存溢出为你收集整理的获取非侵入式升级序列化C的私有数据成员全部内容,希望文章能够帮你解决获取非侵入式升级序列化C的私有数据成员所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1236434.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存