⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 incomplete_type_test.cpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 CPP
字号:
//// Boost.Pointer Container////  Copyright Thorsten Ottosen 2003-2005. 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)//// For more information, see http://www.boost.org/libs/ptr_container/// #include "test_data.hpp"#include <boost/ptr_container/ptr_vector.hpp>#include <boost/utility.hpp>#include <algorithm>#include <iostream>using namespace std;using namespace boost;//// Forward declare 'allocate_clone()' to be able// use clonability of 'Composite' inline in the class.// This is normally not needed when using .hpp + .cpp files.//class Composite;Composite* new_clone( const Composite& );class Composite {    typedef ptr_vector<Composite>         composite_t;    typedef composite_t::iterator         iterator;    typedef composite_t::const_iterator   const_iterator;    typedef composite_t::size_type        size_type;     composite_t                           elements_;    //    // only used internally for 'clone()'    //    Composite( const Composite& r ) : elements_( r.elements_.clone() )    { }        //    // this class is not Copyable nor Assignable     //    void operator=( const Composite& );public:    Composite()    { }        //    // of course detructor is virtual    //    virtual ~Composite()    { }     //    // one way of adding new elements    //    void add( Composite* c )    {        elements_.push_back( c );    }        //    // second way of adding new elements    //    void add( Composite& c )    {        elements_.push_back( new_clone( c ) );    }    void remove( iterator where )    {        elements_.erase( where );    }      //    // recusively count the elements     //    size_type size() const    {        size_type res = 0;        for( const_iterator i = elements_.begin(); i != elements_.end(); ++i )            res += i->size();        return 1 /* this */ + res;    }        void foo()    {        do_foo();        for( iterator i = elements_.begin(); i != elements_.end(); ++i )            i->foo();    }        //    // this class is clonable and this is the callback for 'allocate_clone()'    //    Composite* clone() const    {        return do_clone();    }    private:    virtual void do_foo()     {        cout << "composite base" << "\n";    }    virtual Composite* do_clone() const    {        return new Composite( *this );    }};//// make 'Composite' clonable; note that we do not need to overload// the function in the 'boost' namespace.//Composite* new_clone( const Composite& c ){    return c.clone();}class ConcreteComposite1 : public Composite{    virtual void do_foo()     {        cout << "composite 1" << "\n";     }      virtual Composite* do_clone() const    {        return new ConcreteComposite1();    }};class ConcreteComposite2 : public Composite{    virtual void do_foo()     {        cout << "composite 2" << "\n";    }      virtual Composite* do_clone() const    {        return new ConcreteComposite2();    }};void test_incomplete(){    Composite c;    c.add( new ConcreteComposite1 );    c.add( new ConcreteComposite2 );     BOOST_CHECK_EQUAL( c.size(), 3u );    c.add( new_clone( c ) ); // add c to itself    BOOST_CHECK_EQUAL( c.size(), 6u );    c.add( c );              // add c to itself    BOOST_CHECK_EQUAL( c.size(), 12u );    c.foo();     }using namespace boost;#include <boost/test/unit_test.hpp>using boost::unit_test::test_suite;test_suite* init_unit_test_suite( int argc, char* argv[] ){    test_suite* test = BOOST_TEST_SUITE( "Pointer Container Test Suite" );    test->add( BOOST_TEST_CASE( &test_incomplete ) );    return test;}//// todo: remake example with shared_ptr//

⌨️ 快捷键说明

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