Ответы пользователя по тегу ООП
  • Почему в Java наследование реализовано именно так?

    @Alexander1705
    Нельзя переопределить значения поля, как это работает с методами. В вашем примере вы просто определили новое поле с таким же именем, что привело к так называемому name shadowing.

    Если вы пытаетесь реализовать рефлексию, лучше воспользуйтесь стандартными средствами.

    Если хотите задавать в наследнике значение родительского поля, сделайте в родителе конструктор с соответствующим параметром.
    Ответ написан
    7 комментариев
  • Где взять задачи/мини-проекты по ООП?

    @Alexander1705
    ООП - это подход к проектированию приложений. Любую задачу можно решать используя тот или иной подход.
    Ответ написан
    Комментировать
  • Как распихать значения в файле в разные файлы?

    @Alexander1705
    Как-то так:
    files = [open('freq{}.txt'.format(i), 'w') for i in range(N)]
    
    f2 = open('file2.txt')
    i = 0
    for l in f2.radlines():
        files[i].write(l)
        i = (i+1) % N
    
    f2.close()
    for f in files:
        f.close()
    Ответ написан
    1 комментарий
  • Какое оптимально количество функцый должно быть в класе?(лучшие практики)?

    @Alexander1705
    прочитал что ради 2 функции не стоит создавать клас

    Ради функций класс вообще не нужно создавать. Класс нужно создавать, когда нужно представить некую сущность. А методов должно быть столько, сколько эта сущность подразумевает.
    Ответ написан
    Комментировать
  • Как изменять значения переменных другого класса в C++?

    @Alexander1705
    Первое:
    Если пишите на C++ и используете заголовочные файлы С, их принято называть ctime, а не time.h

    Второе:
    Для псевдослучайных чисел в C++ используйте заголовочный файл random:
    #include <random>
    ...
    std::random_device rd;
    std::cout << rd() % 10;


    Третье:
    Если вам нужен массив, используйте массив. То что вы написали - очень странный костыль.
    Если нужно заполнить массив случайными числами, напишите функцию:
    void fill_with_random(int* arr, size_t n)
    {
        random_device rand;
        for (size_t i = 0; i < n; ++i)
        {
            arr[i] = rand() % 21 - 10; 
        }
    }


    Четвёртое:
    cout << y[0][0]; //все прекрасно выводится
    /*но если попробовать сделать y[0][0]+=1; то выводится ошибка "выражение должно быть допустимым для изменения левосторонним значением"*/

    Естественно, так происходит потому, что в вашем классе (который и не нужен совсем) вы возвращаете число, там где ожидается ссылка:
    int operator [](int i)
    {
        return x[i];
    }

    Заменить на:
    int& operator [](int i)
    {
        return x[i];
    }


    Пятое:
    int  operator [](int i)
    {
        return y[i][0]; /*совершенно непонятно, какую роль здесь играет [0], и почему не работает с просто return y[i]... при изменении [0] на любое другое число, результат не меняется...*/
    }

    Непонятно потому, что его там и не должно быть. operator[] должен давать доступ к строке (т.е. массиву). А уже второй operator[] будет относится к массиву и возвратит ссылку на элемент.
    massiv& operator [](int i)
    {
        return y[i];
    }


    Шестое:
    Если нужна матрица, используйте двумерный массив и не изобретайте велосипед. Если класс всё же необходим, например, если нужно добавить методы для работы с матрицей, можно написать такой класс, используя двумерный массив:
    class Matrix
    {
    public:
        Matrix() {}
        int* operator[] (size_t i)
        {
            return &arr[i][0]; // Указатель на первый элемент i-ой строки.
        }
    private:
        int arr[5][5];
    }


    Седьмое:
    Классы принято называть с большой буквы. И пожалуйста, не называйте их транслитом.
    Массив - Array
    Матрица - Matrix
    Ответ написан
    Комментировать
  • Как использовать чисто виртуальный метод внутри класса?

    @Alexander1705
    В объявлении метод принимает ссылку, а вы передаёте указатель.
    fillBufferForPrint(&s); // Нужно не так.
    fillBufferForPrint(s);  // А так.
    Ответ написан
    Комментировать
  • Как избежать статических списков в классах python?

    @Alexander1705
    Когда вы объявляете переменные-члены, так как вы это сделали, они связаны с классом, а не с объектом. По аналогии с С++, вы создали переменные-члены elements и N статическими.

    Вам нужно создавать переменные-члены в конструкторе, а не в определении класса:
    class Vector:
    
      def __init__(self, N):
        self.elenent = []
        self.N = N
        for i in range(N):
          self.element.append(0)
    
      def __str__(self):
        out_str = ""
        for i in range(self.N):
          out_str = out_str +  str(self.element[i]) + " "
        return out_str
    
      def generate(self):
        random.seed()
        for i in range(self.N):
          self.element[i] = float(random.randint(1, 100))


    Или использовать специальную переменную __slots__:
    class Vector:
    
      __slots__ = ['element', 'N']
    
      def __init__(self, N):
        self.elenent = []
        self.N = N
        for i in range(N):
          self.element.append(0)
    
      def __str__(self):
        out_str = ""
        for i in range(self.N):
          out_str = out_str +  str(self.element[i]) + " "
        return out_str
    
      def generate(self):
        random.seed()
        for i in range(self.N):
          self.element[i] = float(random.randint(1, 100))


    Отличие в том, что во втором случае вы уже не сможете добавить другие переменные-члены, и объекты будут занимать меньше памяти.
    Ответ написан
    Комментировать