Проблема с инициализацией вектора
От: Аноним  
Дата: 21.02.14 14:41
Оценка:
Вот работающий код:
#include <iostream>
#include <memory>
#include <string>
#include <vector>

class Object
{
protected :
    class ObjectData
    {
    public :
        virtual ~ObjectData( ) { }
        virtual void print( ) = 0 ;
    } ;
private :
    std::shared_ptr< ObjectData > data ;
public :
    Object( std::shared_ptr< ObjectData > parameter ): data( parameter ) { }
    void print( ) {
        data->print( ) ;
    }
} ;

class Integer : public Object
{
private :
    class IntegerData : public ObjectData
    {
    private :
        int value ;
    public :
        IntegerData( int parameter ) : value( parameter ) { }
        void print( ) { std::cout << value << "\r\n" ; }
    } ;
public :
    Integer( int parameter ) : Object( std::shared_ptr< IntegerData >( new IntegerData( parameter ) ) ) { }
} ;

class String : public Object
{
private :
    class StringData : public ObjectData
    {
    private :
        std::string value ;
    public :
        StringData( std::string parameter ) : value( parameter ) { }
        void print( ) { std::cout << value << "\r\n" ; }
    } ;
public :
    String( std::string parameter ) : Object( std::shared_ptr< StringData >( new StringData( parameter ) ) ) { }
} ;

void main( )
{
    // инициализация
    std::vector< Object > vector ;
    vector.push_back( Integer( 1 ) ) ;
    vector.push_back( String( "str1" ) ) ;
    // вывод
    vector[ 1 ].print( ) ;
    vector[ 0 ].print( ) ;
}
код компилится и отлично работает. А вот если сделать инициализацию по новым правилам:
void main( )
{
    // инициализация
    std::vector< Object > vector( { Integer( 1 ) , String( "str1" ) } ) ;
    // вывод
    vector[ 1 ].print( ) ;
    vector[ 0 ].print( ) ;
}
тоже компилиться, но строка vector[ 0 ].print( ) выдает эксепшн, при дебаге увидел что действительно элемент 0 содержит хрен знает что. причем если добавить элементов, то кривыми окажутся все, кроме последнего. В чем тут дело. Компилю на vc2013
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.