#include <iostream>
#include <memory>
using namespace std;
template < typename T>
class Array
{
public :
explicit Array( size_t size, const T& value = T( ) ) : size_( size) , memory_( :: operator new ( size_* sizeof ( T) ) )
{
elements = new ( memory_) T[ size_] ;
std:: uninitialized_fill ( elements, elements+ size_, value) ;
}
// конструктор класса, который создает Array размера size, заполненный значениями value типа T.
// Если у класса нет конструктора по умолчанию, то второй аргумент этого конструктора обязателен.
Array( ) : size_( 0 ) , elements( new T[ 0 ] ) { }
// конструктор класса, который можно вызвать без параметров. Должен создавать пустой Array.
Array( const Array& other) : size_( other.size_ ) , memory_( :: operator new ( size_* sizeof ( T) ) )
{
elements = new ( memory_) T[ size_] ;
std:: uninitialized_copy ( other.elements , other.elements + size_, elements) ;
}
// конструктор копирования, который создает копию параметра. Для типа T оператор присваивания не определен.
~Array( )
{
for ( size_t i = 0 ; i! = size_; ++ i)
elements[ i] .~T( ) ;
:: operator delete [ ] ( elements) ;
}
// деструктор, если он вам необходим.
Array& operator= ( const Array& other)
{
if ( this == & other) return * this ;
for ( size_t i = 0 ; i! = size_; ++ i)
elements[ i] .~T( ) ;
:: operator delete [ ] ( memory_) ;
memory_ = :: operator new ( other.size_ ) ;
elements = new ( memory_) T[ other.size_ ] ;
std:: uninitialized_copy ( other.elements , other.elements + size_, elements) ;
size_ = other.size_ ;
return * this ;
}
// оператор присваивания.
size_t size( ) const { return size_; }
// возвращает размер массива (количество элементов).
T& operator[ ] ( size_t index) { return elements[ index] ; }
const T& operator[ ] ( size_t index) const { return elements[ index] ; }
// две версии оператора доступа по индексу.
private :
size_t size_;
char * memory_;
T* elements;
} ;
int main( ) {
Array< float > ololo{ } ;
Array< float > psh( 12 , 321.099f ) ;
std:: cout << "psh[10] = " << psh[ 10 ] << '\n ' ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIEFycmF5CnsKcHVibGljOgogICAgZXhwbGljaXQgQXJyYXkoc2l6ZV90IHNpemUsIGNvbnN0IFQmIHZhbHVlID0gVCgpKTogc2l6ZV8oc2l6ZSksIG1lbW9yeV8oOjpvcGVyYXRvciBuZXcoc2l6ZV8qc2l6ZW9mKFQpKSkKICAgIHsKICAgICAgICBlbGVtZW50cyA9IG5ldyAobWVtb3J5XykgVFtzaXplX107CiAgICAgICAgc3RkOjp1bmluaXRpYWxpemVkX2ZpbGwoZWxlbWVudHMsIGVsZW1lbnRzK3NpemVfLCB2YWx1ZSk7CiAgICB9CiAgICAvLyDQutC+0L3RgdGC0YDRg9C60YLQvtGAINC60LvQsNGB0YHQsCwg0LrQvtGC0L7RgNGL0Lkg0YHQvtC30LTQsNC10YIgQXJyYXkg0YDQsNC30LzQtdGA0LAgc2l6ZSwg0LfQsNC/0L7Qu9C90LXQvdC90YvQuSDQt9C90LDRh9C10L3QuNGP0LzQuCB2YWx1ZSDRgtC40L/QsCBULiAKICAgIC8vINCV0YHQu9C4INGDINC60LvQsNGB0YHQsCDQvdC10YIg0LrQvtC90YHRgtGA0YPQutGC0L7RgNCwINC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOLCDRgtC+INCy0YLQvtGA0L7QuSDQsNGA0LPRg9C80LXQvdGCINGN0YLQvtCz0L4g0LrQvtC90YHRgtGA0YPQutGC0L7RgNCwINC+0LHRj9C30LDRgtC10LvQtdC9LgoKICAgIEFycmF5KCk6IHNpemVfKDApLCBlbGVtZW50cyhuZXcgVFswXSl7fQogICAgLy8gICDQutC+0L3RgdGC0YDRg9C60YLQvtGAINC60LvQsNGB0YHQsCwg0LrQvtGC0L7RgNGL0Lkg0LzQvtC20L3QviDQstGL0LfQstCw0YLRjCDQsdC10Lcg0L/QsNGA0LDQvNC10YLRgNC+0LIuINCU0L7Qu9C20LXQvSDRgdC+0LfQtNCw0LLQsNGC0Ywg0L/Rg9GB0YLQvtC5IEFycmF5LgogIAogICAgQXJyYXkoY29uc3QgQXJyYXkmIG90aGVyKTogc2l6ZV8ob3RoZXIuc2l6ZV8pLCBtZW1vcnlfKDo6b3BlcmF0b3IgbmV3IChzaXplXypzaXplb2YoVCkpKQogICAgewogICAgICAgIGVsZW1lbnRzID0gbmV3IChtZW1vcnlfKSBUW3NpemVfXTsKICAgICAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weShvdGhlci5lbGVtZW50cywgb3RoZXIuZWxlbWVudHMgKyBzaXplXywgZWxlbWVudHMpOwogICAgfQogICAgLy8gICDQutC+0L3RgdGC0YDRg9C60YLQvtGAINC60L7Qv9C40YDQvtCy0LDQvdC40Y8sINC60L7RgtC+0YDRi9C5INGB0L7Qt9C00LDQtdGCINC60L7Qv9C40Y4g0L/QsNGA0LDQvNC10YLRgNCwLiDQlNC70Y8g0YLQuNC/0LAgVCDQvtC/0LXRgNCw0YLQvtGAINC/0YDQuNGB0LLQsNC40LLQsNC90LjRjyDQvdC1INC+0L/RgNC10LTQtdC70LXQvS4KCiAgICB+QXJyYXkoKQogICAgewogICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkhPXNpemVfOysraSkKICAgICAgICAgICAgZWxlbWVudHNbaV0uflQoKTsKICAgICAgICA6Om9wZXJhdG9yIGRlbGV0ZVtdKGVsZW1lbnRzKTsKICAgIH0KICAgIC8vICAg0LTQtdGB0YLRgNGD0LrRgtC+0YAsINC10YHQu9C4INC+0L0g0LLQsNC8INC90LXQvtCx0YXQvtC00LjQvC4KICAgIAogICAgQXJyYXkmIG9wZXJhdG9yPShjb25zdCBBcnJheSYgb3RoZXIpCiAgICB7CiAgICAgICAgaWYodGhpcz09Jm90aGVyKSByZXR1cm4gKnRoaXM7CiAgICAgICAgCiAgICAgICAgZm9yKHNpemVfdCBpID0gMDsgaSE9c2l6ZV87KytpKQogICAgICAgICAgICBlbGVtZW50c1tpXS5+VCgpOwogICAgICAgIDo6b3BlcmF0b3IgZGVsZXRlW10obWVtb3J5Xyk7CgogICAgICAgIG1lbW9yeV8gPSA6Om9wZXJhdG9yIG5ldyhvdGhlci5zaXplXyk7CiAgICAgICAgZWxlbWVudHMgPSBuZXcgKG1lbW9yeV8pIFRbb3RoZXIuc2l6ZV9dOwogICAgICAgIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KG90aGVyLmVsZW1lbnRzLCBvdGhlci5lbGVtZW50cyArIHNpemVfLCBlbGVtZW50cyk7CiAgICAgICAgc2l6ZV8gPSBvdGhlci5zaXplXzsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICAvLyAgINC+0L/QtdGA0LDRgtC+0YAg0L/RgNC40YHQstCw0LjQstCw0L3QuNGPLgogICAgICAgIAogICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQogICAgLy8gICDQstC+0LfQstGA0LDRidCw0LXRgiDRgNCw0LfQvNC10YAg0LzQsNGB0YHQuNCy0LAgKNC60L7Qu9C40YfQtdGB0YLQstC+INGN0LvQtdC80LXQvdGC0L7QsikuCgogICAgVCYgb3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIHsgcmV0dXJuIGVsZW1lbnRzW2luZGV4XTsgfQogICAgY29uc3QgVCYgb3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGVsZW1lbnRzW2luZGV4XTsgfQogICAgLy8gICDQtNCy0LUg0LLQtdGA0YHQuNC4INC+0L/QtdGA0LDRgtC+0YDQsCDQtNC+0YHRgtGD0L/QsCDQv9C+INC40L3QtNC10LrRgdGDLgpwcml2YXRlOgogICAgc2l6ZV90IHNpemVfOwogICAgY2hhciogbWVtb3J5XzsKICAgIFQqIGVsZW1lbnRzOwp9OwoKaW50IG1haW4oKSB7CglBcnJheTxmbG9hdD4gb2xvbG97fTsKCUFycmF5PGZsb2F0PiBwc2goMTIsIDMyMS4wOTlmKTsKCXN0ZDo6Y291dCA8PCAicHNoWzEwXSA9ICIgPDwgcHNoWzEwXSA8PCAnXG4nOwoJcmV0dXJuIDA7Cn0=
compilation info
prog.cpp: In instantiation of ‘Array<T>::Array(size_t, const T&) [with T = float; size_t = long unsigned int]’:
prog.cpp:65:31: required from here
prog.cpp:9:91: error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]
explicit Array(size_t size, const T& value = T()): size_(size), memory_(::operator new(size_*sizeof(T)))
~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~
stdout