demo_shared_ptr.cpp

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

CPP
165
字号
// demo_shared_ptr.cpp : demonstrates adding serialization to a template// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . Polymorphic// derived pointer example by David Tonge.// 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)////  See http://www.boost.org for updates, documentation, and revision history.#include <iomanip>#include <iostream>#include <cstddef> // NULL#include <fstream>#include <string>#include <cstdio> // remove#include <boost/config.hpp>#if defined(BOOST_NO_STDC_NAMESPACE)namespace std{     using ::remove;}#endif#include <boost/archive/text_oarchive.hpp>#include <boost/archive/text_iarchive.hpp>#include <boost/archive/tmpdir.hpp>#include <boost/serialization/shared_ptr.hpp>///////////////////////////// test shared_ptr serializationclass A{private:    friend class boost::serialization::access;    int x;    template<class Archive>    void serialize(Archive & ar, const unsigned int /* file_version */){        ar & x;    }public:    static int count;    A(){++count;}    // default constructor    virtual ~A(){--count;}   // default destructor};BOOST_SERIALIZATION_SHARED_PTR(A)/////////////////// ADDITION BY DTclass B : public A{private:    friend class boost::serialization::access;    int x;    template<class Archive>    void serialize(Archive & ar, const unsigned int /* file_version */){        ar & boost::serialization::base_object<A>(*this);    }public:    static int count;    B() : A() {};    virtual ~B() {};};BOOST_SERIALIZATION_SHARED_PTR(B)/////////////////int A::count = 0;void display(boost::shared_ptr<A> &spa, boost::shared_ptr<A> &spa1){    std::cout << "a = 0x" << std::hex << spa.get() << " ";    if (spa.get()) std::cout << "is a " << typeid(*(spa.get())).name() << "* ";    std::cout << "use count = " << std::dec << spa.use_count() << std::endl;    std::cout << "a1 = 0x" << std::hex << spa1.get() << " ";    if (spa1.get()) std::cout << "is a " << typeid(*(spa1.get())).name() << "* ";    std::cout << "use count = " << std::dec << spa1.use_count() << std::endl;    std::cout << "unique element count = " << A::count << std::endl;}int main(int /* argc */, char /* *argv[] */){    std::string filename(boost::archive::tmpdir());    filename += "/testfile";    // create  a new shared pointer to ta new object of type A    boost::shared_ptr<A> spa(new A);    boost::shared_ptr<A> spa1;    spa1 = spa;    display(spa, spa1);    // serialize it    {        std::ofstream ofs(filename.c_str());        boost::archive::text_oarchive oa(ofs);        oa << spa;        oa << spa1;    }    // reset the shared pointer to NULL    // thereby destroying the object of type A    spa.reset();    spa1.reset();    display(spa, spa1);    // restore state to one equivalent to the original    // creating a new type A object    {        // open the archive        std::ifstream ifs(filename.c_str());        boost::archive::text_iarchive ia(ifs);        // restore the schedule from the archive        ia >> spa;        ia >> spa1;    }    display(spa, spa1);    spa.reset();    spa1.reset();    std::cout << std::endl;    std::cout << std::endl;    std::cout << "New tests" << std::endl;    /////////////////    // ADDITION BY DT    // create  a new shared pointer to ta new object of type A    spa = boost::shared_ptr<A>(new B);    spa1 = spa;    display(spa, spa1);    // serialize it    {        std::ofstream ofs(filename.c_str());        boost::archive::text_oarchive oa(ofs);        oa.register_type(static_cast<B *>(NULL));        oa << spa;        oa << spa1;    }    // reset the shared pointer to NULL    // thereby destroying the object of type B    spa.reset();    spa1.reset();    display(spa, spa1);    // restore state to one equivalent to the original    // creating a new type B object    {        // open the archive        std::ifstream ifs(filename.c_str());        boost::archive::text_iarchive ia(ifs);        // restore the schedule from the archive        ia.register_type(static_cast<B *>(NULL));        ia >> spa;        ia >> spa1;    }    display(spa, spa1);    ///////////////    std::remove(filename.c_str());    // obj of type A gets destroyed    // as smart_ptr goes out of scope    return 0;}

⌨️ 快捷键说明

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