Статические методы класса

Рейтинг: -1Ответов: 1Опубликовано: 14.05.2023

Помогите, пожалуйста, разобраться с вопросом по статическим методам класса. Есть задача: написать класс Матрица, в котором должны быть добавлены статические методы класса, которые создают нулевую и единичную матрицы указанного размера. Пыталась сделать по условию, а именно передавать размер в эти методы, но не понимаю, как довести до конца, если в статическом методе можно обращаться только к статическим полям, а все поля у меня в классе сделаны нестатическими. Получилось сделать, передав в метод указатель на объект класса и дальше уже с ним работать, но это выглядит, как по мне, не совсем по условию и как-то сложно... Может, есть идеи попроще и более подходящие к условию (а именно, чтоб размер передавался в метод)? Код:

template <class T> 
class matrix {
private: 
  T** mm; // матрица 
  int r; // количество строк 
  int c; // количество столбцов 
public: 
   matrix() { 
    r = 0; 
    c = 0; 
    mm = nullptr; 
   } 
  matrix(int r, int c) { 
    this->r = r; 
    this->c = c; 
    mm = new T*[r]; 
    for (int i = 0; i < r; i++) 
      mm[i] = new T[c]; 
    for (int i = 0; i < r; i++) 
      for (int j = 0; j < c; j++) 
         mm[i][j] = 0; 
  } 
  
//...

static void one_matr(matrix* b) {

for ( int i = 0; i < (*b).r; i++)
 for ( int j = 0; j < (*b).r; j++) 

    if (i == j )  


     (*b).mm[i][j] = 1; 
 
   else 
 
       (*b).mm[i][j] = 0; 
 } 
};

int main() {
  matrix<int> M2(2, 2);
  matrix<int>::one_matr(&M2);
  std::cout << M2; //перегрузка оператора вывода в поток в классе есть
  return 0;
 }

Ответы

▲ 0

Единичные матрицы - подмножество квадратных:

template<typename T>
static matrix<T> one_matr(int order) {
    matrix<T> mtrx{order,order};

    for (int idx = 0; idx < order; ++idx)
        mtrx.mm[idx][idx] = 1;

    return mtrx;
}

int main() {
    auto my_mtrx = matrix::one_matr<int>(5);
    return 0;
}

Если используете C++20 и старше, лучше сразу концептами валидацию шаблона сделать (альтернатива SFINAE):

#include <concepts>

template<typename T>
concept numeric = std::integral<T> || std::floating_point<T>;

template<numeric T>
static matrix<T> one_matr(int order);

template<numeric T> class matrix;