#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+CmNsYXNzIEFycmF5CnsKcHVibGljOgogICAgZXhwbGljaXQgQXJyYXkoc2l6ZV90IHNpemUsIGNvbnN0IFQmIHZhbHVlID0gVCgpKTogc2l6ZV8oc2l6ZSksIG1lbW9yeV8oOjpvcGVyYXRvciBuZXcoc2l6ZV8qc2l6ZW9mKFQpKQogICAgewogICAgICAgIGVsZW1lbnRzID0gbmV3IChtZW1vcnlfKSBUW3NpemVfXTsKICAgICAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfZmlsbChlbGVtZW50cywgZWxlbWVudHMrc2l6ZV8sIHZhbHVlKTsKICAgIH0KICAgIC8vINC60L7QvdGB0YLRgNGD0LrRgtC+0YAg0LrQu9Cw0YHRgdCwLCDQutC+0YLQvtGA0YvQuSDRgdC+0LfQtNCw0LXRgiBBcnJheSDRgNCw0LfQvNC10YDQsCBzaXplLCDQt9Cw0L/QvtC70L3QtdC90L3Ri9C5INC30L3QsNGH0LXQvdC40Y/QvNC4IHZhbHVlINGC0LjQv9CwIFQuIAogICAgLy8g0JXRgdC70Lgg0YMg0LrQu9Cw0YHRgdCwINC90LXRgiDQutC+0L3RgdGC0YDRg9C60YLQvtGA0LAg0L/QviDRg9C80L7Qu9GH0LDQvdC40Y4sINGC0L4g0LLRgtC+0YDQvtC5INCw0YDQs9GD0LzQtdC90YIg0Y3RgtC+0LPQviDQutC+0L3RgdGC0YDRg9C60YLQvtGA0LAg0L7QsdGP0LfQsNGC0LXQu9C10L0uCgogICAgQXJyYXkoKTogc2l6ZV8oMCksIGVsZW1lbnRzKG5ldyBUWzBdKXt9CiAgICAvLyAgINC60L7QvdGB0YLRgNGD0LrRgtC+0YAg0LrQu9Cw0YHRgdCwLCDQutC+0YLQvtGA0YvQuSDQvNC+0LbQvdC+INCy0YvQt9Cy0LDRgtGMINCx0LXQtyDQv9Cw0YDQsNC80LXRgtGA0L7Qsi4g0JTQvtC70LbQtdC9INGB0L7Qt9C00LDQstCw0YLRjCDQv9GD0YHRgtC+0LkgQXJyYXkuCiAgCiAgICBBcnJheShjb25zdCBBcnJheSYgb3RoZXIpOiBzaXplXyhvdGhlci5zaXplXyksIG1lbW9yeV8oOjpvcGVyYXRvciBuZXcgKHNpemVfKnNpemVvZihUKSkpCiAgICB7CiAgICAgICAgZWxlbWVudHMgPSBuZXcgKG1lbW9yeV8pIFRbc2l6ZV9dOwogICAgICAgIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KG90aGVyLmVsZW1lbnRzLCBvdGhlci5lbGVtZW50cyArIHNpemVfLCBlbGVtZW50cyk7CiAgICB9CiAgICAvLyAgINC60L7QvdGB0YLRgNGD0LrRgtC+0YAg0LrQvtC/0LjRgNC+0LLQsNC90LjRjywg0LrQvtGC0L7RgNGL0Lkg0YHQvtC30LTQsNC10YIg0LrQvtC/0LjRjiDQv9Cw0YDQsNC80LXRgtGA0LAuINCU0LvRjyDRgtC40L/QsCBUINC+0L/QtdGA0LDRgtC+0YAg0L/RgNC40YHQstCw0LjQstCw0L3QuNGPINC90LUg0L7Qv9GA0LXQtNC10LvQtdC9LgoKICAgIH5BcnJheSgpCiAgICB7CiAgICAgICAgZm9yKHNpemVfdCBpID0gMDsgaSE9c2l6ZV87KytpKQogICAgICAgICAgICBlbGVtZW50c1tpXS5+VCgpOwogICAgICAgIDo6b3BlcmF0b3IgZGVsZXRlW10oZWxlbWVudHMpOwogICAgfQogICAgLy8gICDQtNC10YHRgtGA0YPQutGC0L7RgCwg0LXRgdC70Lgg0L7QvSDQstCw0Lwg0L3QtdC+0LHRhdC+0LTQuNC8LgogICAgCiAgICBBcnJheSYgb3BlcmF0b3I9KGNvbnN0IEFycmF5JiBvdGhlcikKICAgIHsKICAgICAgICBpZih0aGlzPT0mb3RoZXIpIHJldHVybiAqdGhpczsKICAgICAgICAKICAgICAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIT1zaXplXzsrK2kpCiAgICAgICAgICAgIGVsZW1lbnRzW2ldLn5UKCk7CiAgICAgICAgOjpvcGVyYXRvciBkZWxldGVbXShtZW1vcnlfKTsKCiAgICAgICAgbWVtb3J5XyA9IDo6b3BlcmF0b3IgbmV3KG90aGVyLnNpemVfKTsKICAgICAgICBlbGVtZW50cyA9IG5ldyAobWVtb3J5XykgVFtvdGhlci5zaXplX107CiAgICAgICAgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkob3RoZXIuZWxlbWVudHMsIG90aGVyLmVsZW1lbnRzICsgc2l6ZV8sIGVsZW1lbnRzKTsKICAgICAgICBzaXplXyA9IG90aGVyLnNpemVfOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIC8vICAg0L7Qv9C10YDQsNGC0L7RgCDQv9GA0LjRgdCy0LDQuNCy0LDQvdC40Y8uCiAgICAgICAgCiAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfOyB9CiAgICAvLyAgINCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINGA0LDQt9C80LXRgCDQvNCw0YHRgdC40LLQsCAo0LrQvtC70LjRh9C10YHRgtCy0L4g0Y3Qu9C10LzQtdC90YLQvtCyKS4KCiAgICBUJiBvcGVyYXRvcltdKHNpemVfdCBpbmRleCkgeyByZXR1cm4gZWxlbWVudHNbaW5kZXhdOyB9CiAgICBjb25zdCBUJiBvcGVyYXRvcltdKHNpemVfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gZWxlbWVudHNbaW5kZXhdOyB9CiAgICAvLyAgINC00LLQtSDQstC10YDRgdC40Lgg0L7Qv9C10YDQsNGC0L7RgNCwINC00L7RgdGC0YPQv9CwINC/0L4g0LjQvdC00LXQutGB0YMuCnByaXZhdGU6CiAgICBzaXplX3Qgc2l6ZV87CiAgICBjaGFyKiBtZW1vcnlfOwogICAgVCogZWxlbWVudHM7Cn07CgppbnQgbWFpbigpIHsKCUFycmF5PGZsb2F0PiBvbG9sb3t9OwoJQXJyYXk8ZmxvYXQ+IHBzaCgxMiwgMzIxLjA5OWYpOwoJc3RkOjpjb3V0IDw8ICJwc2hbMTBdID0gIiA8PCBwc2hbMTBdIDw8ICdcbic7CglyZXR1cm4gMDsKfQ==
prog.cpp: In constructor ‘Array<T>::Array(size_t, const T&)’:
prog.cpp:9:56: error: class ‘Array<T>’ does not have any field named ‘size_’
explicit Array(size_t size, const T& value = T()): size_(size), memory_(::operator new(size_*sizeof(T))
^~~~~
prog.cpp:9:92: error: ‘size_’ was not declared in this scope
explicit Array(size_t size, const T& value = T()): size_(size), memory_(::operator new(size_*sizeof(T))
^~~~~
prog.cpp:17:42: error: expected ‘)’ before ‘{’ token
Array(): size_(0), elements(new T[0]){}
^
prog.cpp:21:5: error: expected ‘)’ before ‘{’ token
{
^
prog.cpp:58:12: error: expected ‘{’ at end of input
size_t size_;
^~~~~
prog.cpp: In function ‘int main()’:
prog.cpp:64:21: error: no matching function for call to ‘Array<float>::Array(<brace-enclosed initializer list>)’
Array<float> ololo{};
^
prog.cpp:9:14: note: candidate: Array<T>::Array(size_t, const T&) [with T = float; size_t = long unsigned int]
explicit Array(size_t size, const T& value = T()): size_(size), memory_(::operator new(size_*sizeof(T))
^~~~~
prog.cpp:9:14: note: candidate expects 2 arguments, 0 provided
prog.cpp:6:7: note: candidate: constexpr Array<float>::Array(const Array<float>&)
class Array
^~~~~
prog.cpp:6:7: note: candidate expects 1 argument, 0 provided
prog.cpp:6:7: note: candidate: constexpr Array<float>::Array(Array<float>&&)
prog.cpp:6:7: note: candidate expects 1 argument, 0 provided
prog.cpp:66:34: error: no match for ‘operator[]’ (operand types are ‘Array<float>’ and ‘int’)
std::cout << "psh[10] = " << psh[10] << '\n';
^