test_non_default_ctor2.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 142 行

CPP
142
字号
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8// test_non_default_ctor2.cpp// (C) Copyright 2002 Martin Ecker. // Use, modification and distribution is subject to the Boost Software// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)// should pass compilation and execution// this tests complex usage of non-default constructor.  Specifically// the case where a constructor serializes a pointer member.#include <fstream>#include <boost/config.hpp>#include "test_tools.hpp"class IntValueHolder{public:    IntValueHolder()        : value(0)    {}    IntValueHolder(int newvalue)        : value(newvalue)    {}    int GetValue() const { return value; }private:    int value;    friend class boost::serialization::access;    template <class ArchiveT>    void serialize(ArchiveT& ar, const unsigned int /* file_version */)    {        ar & BOOST_SERIALIZATION_NVP(value);    }};class FloatValueHolder{public:    FloatValueHolder()        : value(0)    {}    FloatValueHolder(float newvalue)        : value(newvalue)    {}    float GetValue() const { return value; }private:    float value;    friend class boost::serialization::access;    template <class ArchiveT>    void serialize(ArchiveT& ar, const unsigned int /* file_version */)    {        ar & BOOST_SERIALIZATION_NVP(value);    }};class A{public:    A(const IntValueHolder& initialValue)        : value(initialValue), floatValue(new FloatValueHolder(10.0f))    {}    ~A()    {        delete floatValue;    }    IntValueHolder value;    FloatValueHolder* floatValue;private:    friend class boost::serialization::access;    template <class ArchiveT>    void serialize(ArchiveT& ar, const unsigned int /* file_version */)    {        ar & BOOST_SERIALIZATION_NVP(floatValue);    }};namespace boost { namespace serialization {template <class ArchiveT>void save_construct_data(    ArchiveT& archive,     const A* p,     const BOOST_PFTO unsigned int version){    archive & boost::serialization::make_nvp("initialValue", p->value);}template <class ArchiveT>void load_construct_data(ArchiveT& archive, A* p, unsigned int version){    IntValueHolder initialValue;    archive & boost::serialization::make_nvp("initialValue", initialValue);    ::new (p) A(initialValue);}} // serialization} // namespace boostint test_main( int /* argc */, char* /* argv */[] ){    const char * testfile = boost::archive::tmpnam(NULL);    BOOST_REQUIRE(NULL != testfile);    A* a = new A(5);    {           test_ostream os(testfile, TEST_STREAM_FLAGS);        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);        oa << BOOST_SERIALIZATION_NVP(a);    }    A* a_new;    {        test_istream is(testfile, TEST_STREAM_FLAGS);        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);        ia >> BOOST_SERIALIZATION_NVP(a_new);    }    delete a;    delete a_new;    return EXIT_SUCCESS;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?