Вот работающий код:
#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