Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdexcept>
- class Ta {
- public:
- Ta() = default;
- Ta(const Ta& ta);
- Ta& operator=(const Ta& rhs);
- ~Ta();
- Ta(const std::ptrdiff_t i, const std::ptrdiff_t j, const std::ptrdiff_t k);
- std::ptrdiff_t get_i() const { return i_; }
- std::ptrdiff_t get_j() const { return j_; }
- std::ptrdiff_t get_k() const { return k_; }
- float& at(const std::ptrdiff_t i, const std::ptrdiff_t j, const std::ptrdiff_t k);
- float at(const std::ptrdiff_t i, const std::ptrdiff_t j, const std::ptrdiff_t k) const;
- private:
- float* data_{nullptr};
- std::ptrdiff_t* rows_{nullptr};
- std::ptrdiff_t i_{0};
- std::ptrdiff_t j_{0};
- std::ptrdiff_t k_{0};
- void copy_from(const Ta& ta);
- };
- Ta::Ta(const std::ptrdiff_t i, const std::ptrdiff_t j, const std::ptrdiff_t k) :
- i_(i), j_(j), k_(k)
- {
- if (i <= 0 || j <= 0 || k <= 0)
- throw std::invalid_argument("Size cannot be negative");
- data_ = new float[i * j * k];
- for (int _ = 0; _ < i * j * k; _++)
- data_[_] = 0.0f;
- rows_ = new std::ptrdiff_t[i];
- for (int a = 0; a < i; a++) {
- rows_[a] = a * j * k;
- }
- }
- Ta::Ta(const Ta& ta) {
- copy_from(ta);
- }
- Ta& Ta::operator=(const Ta& rhs) {
- if (this != &rhs) {
- delete[] data_;
- delete[] rows_;
- copy_from(rhs);
- }
- return *this;
- }
- Ta::~Ta() {
- delete[] data_;
- delete[] rows_;
- }
- float& Ta::at(const std::ptrdiff_t i, const std::ptrdiff_t j, const std::ptrdiff_t k) {
- if (i < 0 || i >= i_ || j < 0 || j >= j_ || k < 0 || k >= k_)
- throw std::out_of_range("Index out of range");
- return data_[rows_[i] + j * k_ + k];
- }
- float Ta::at(const std::ptrdiff_t i, const std::ptrdiff_t j, const std::ptrdiff_t k) const {
- if (i < 0 || i >= i_ || j < 0 || j >= j_ || k < 0 || k >= k_)
- throw std::out_of_range("Index out of range");
- return data_[rows_[i] + j * k_ + k];
- }
- void Ta::copy_from(const Ta& ta) {
- i_ = ta.i_;
- j_ = ta.j_;
- k_ = ta.k_;
- data_ = new float[i_ * j_ * k_];
- for (int _ = 0; _ < i_ * j_ * k_; _++)
- data_[_] = ta.data_[_];
- rows_ = new std::ptrdiff_t[i_];
- for (int _ = 0; _ < i_; _++)
- rows_[_] = ta.rows_[_];
- }
- int main() {
- Ta t(5, 4, 3);
- std::cout << "i: " << t.get_i() << std::endl;
- std::cout << "j: " << t.get_j() << std::endl;
- std::cout << "k: " << t.get_k() << std::endl;
- try {
- Ta t0(0, 1, 1);
- }
- catch (std::invalid_argument) {
- std::cout << "Error: Ta t0(0, 1, 1);" << std::endl;
- }
- try {
- t.at(5, 0, 0);
- }
- catch (std::out_of_range) {
- std::cout << "Error: t.at(5, 0, 0);" << std::endl;
- }
- try {
- t.at(3, -1, 0);
- }
- catch (std::out_of_range) {
- std::cout << "Error: t.at(3, -1, 0);" << std::endl;
- }
- std::cout << t.at(3, 1, 2) << std::endl;
- std::cout << t.at(4, 3, 2) << std::endl;
- t.at(4, 3, 2) = 5.0f;
- std::cout << t.at(4, 3, 2) << std::endl;
- const Ta tc(5, 4, 3);
- std::cout << tc.at(4, 3, 2) << std::endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement