Advertisement
Arhons

Untitled

Apr 13th, 2022
387
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.12 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdexcept>
  3.  
  4.  
  5. class Ta {
  6. public:
  7.     Ta() = default;
  8.     Ta(const Ta& ta);
  9.     Ta& operator=(const Ta& rhs);
  10.     ~Ta();
  11.  
  12.     Ta(const std::ptrdiff_t i, const std::ptrdiff_t j, const std::ptrdiff_t k);
  13.  
  14.     std::ptrdiff_t get_i() const { return i_; }
  15.     std::ptrdiff_t get_j() const { return j_; }
  16.     std::ptrdiff_t get_k() const { return k_; }
  17.  
  18.     float& at(const std::ptrdiff_t i, const std::ptrdiff_t j, const std::ptrdiff_t k);
  19.     float at(const std::ptrdiff_t i, const std::ptrdiff_t j, const std::ptrdiff_t k) const;
  20.  
  21. private:
  22.     float* data_{nullptr};
  23.     std::ptrdiff_t* rows_{nullptr};
  24.     std::ptrdiff_t i_{0};
  25.     std::ptrdiff_t j_{0};
  26.     std::ptrdiff_t k_{0};
  27.  
  28.     void copy_from(const Ta& ta);
  29. };
  30.  
  31. Ta::Ta(const std::ptrdiff_t i, const std::ptrdiff_t j, const std::ptrdiff_t k) :
  32.     i_(i), j_(j), k_(k)
  33. {
  34.     if (i <= 0 || j <= 0 || k <= 0)
  35.         throw std::invalid_argument("Size cannot be negative");
  36.  
  37.     data_ = new float[i * j * k];
  38.     for (int _ = 0; _ < i * j * k; _++)
  39.         data_[_] = 0.0f;
  40.  
  41.     rows_ = new std::ptrdiff_t[i];
  42.  
  43.     for (int a = 0; a < i; a++) {
  44.         rows_[a] = a * j * k;
  45.     }
  46. }
  47.  
  48. Ta::Ta(const Ta& ta) {
  49.     copy_from(ta);
  50. }
  51.  
  52. Ta& Ta::operator=(const Ta& rhs) {
  53.     if (this != &rhs) {
  54.         delete[] data_;
  55.         delete[] rows_;
  56.         copy_from(rhs);
  57.     }
  58.     return *this;
  59. }
  60.  
  61. Ta::~Ta() {
  62.     delete[] data_;
  63.     delete[] rows_;
  64. }
  65.  
  66. float& Ta::at(const std::ptrdiff_t i, const std::ptrdiff_t j, const std::ptrdiff_t k) {
  67.     if (i < 0 || i >= i_ || j < 0 || j >= j_ || k < 0 || k >= k_)
  68.         throw std::out_of_range("Index out of range");
  69.     return data_[rows_[i] + j * k_ + k];
  70. }
  71.  
  72. float Ta::at(const std::ptrdiff_t i, const std::ptrdiff_t j, const std::ptrdiff_t k) const {
  73.     if (i < 0 || i >= i_ || j < 0 || j >= j_ || k < 0 || k >= k_)
  74.         throw std::out_of_range("Index out of range");
  75.     return data_[rows_[i] + j * k_ + k];
  76. }
  77.  
  78. void Ta::copy_from(const Ta& ta) {
  79.     i_ = ta.i_;
  80.     j_ = ta.j_;
  81.     k_ = ta.k_;
  82.     data_ = new float[i_ * j_ * k_];
  83.     for (int _ = 0; _ < i_ * j_ * k_; _++)
  84.         data_[_] = ta.data_[_];
  85.  
  86.     rows_ = new std::ptrdiff_t[i_];
  87.     for (int _ = 0; _ < i_; _++)
  88.         rows_[_] = ta.rows_[_];
  89. }
  90.  
  91. int main() {
  92.     Ta t(5, 4, 3);
  93.     std::cout << "i: " << t.get_i() << std::endl;
  94.     std::cout << "j: " << t.get_j() << std::endl;
  95.     std::cout << "k: " << t.get_k() << std::endl;
  96.  
  97.     try {
  98.         Ta t0(0, 1, 1);
  99.     }
  100.     catch (std::invalid_argument) {
  101.         std::cout << "Error: Ta t0(0, 1, 1);" << std::endl;
  102.     }
  103.  
  104.     try {
  105.         t.at(5, 0, 0);
  106.     }
  107.     catch (std::out_of_range) {
  108.         std::cout << "Error: t.at(5, 0, 0);" << std::endl;
  109.     }
  110.  
  111.     try {
  112.         t.at(3, -1, 0);
  113.     }
  114.     catch (std::out_of_range) {
  115.         std::cout << "Error: t.at(3, -1, 0);" << std::endl;
  116.     }
  117.  
  118.     std::cout << t.at(3, 1, 2) << std::endl;
  119.     std::cout << t.at(4, 3, 2) << std::endl;
  120.  
  121.     t.at(4, 3, 2) = 5.0f;
  122.  
  123.     std::cout << t.at(4, 3, 2) << std::endl;
  124.  
  125.     const Ta tc(5, 4, 3);
  126.     std::cout << tc.at(4, 3, 2) << std::endl;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement