Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
2 / 2 / 2
Регистрация: 12.04.2014
Сообщений: 102

Реализация методов доступа к закрытым полям (геттеры и сеттеры)

07.05.2015, 20:30. Показов 4763. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте. Нужно реализовать в программе методы get и set
Вот мой код:
Заголовочный файл
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iomanip>
 
class Matrix
{
private:
    float **m_ptr;
    size_t m_size;
 
public:
    Matrix(); // конструктор по умолчанию
    Matrix( size_t ); // конструктор с параметрами
    Matrix(const Matrix &ob); // конструктор копии
    ~Matrix(); // деструктор 
    size_t getm_size();
    float **getm_ptr();
    void setm_size(size_t);
    void setm_ptr(float);
    Matrix &operator= (const Matrix& ob) ;
    Matrix  operator* (const Matrix& ob ); 
    Matrix  operator* (float); 
    Matrix  operator/ ( float); 
    friend std::ostream &operator<< (std::ostream &, const Matrix &);
    friend std::istream &operator>> (std::istream &, Matrix &); 
};
Код реализации методов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Matrix::setm_size(size_t mat )
{
    m_size = mat;
} 
float  Matrix::**setm_ptr(float **pmat)
{   m_ptr=pmat;//ругается идентификатор не определен
}
size_t Matrix::getm_size() 
{
    return  m_size;
}
 
float Matrix::**getm_ptr()
{   return  m_ptr;//ругается идентифекатор не определен
Не совсем понимаю, как правильно сделать доступ к этой переменной float **m_ptr;
Преподаватель попросил добавить их в код. Хотя все остальные методы написаны без их участия, объясняя это, что без них "Матрица вещь в себе". Понимаю, что нужен доступ к private полям, но насколько это важно, если эти методы нигде не использовала в программе. Просто правило программирования хорошего уровня?

В исходном коде.cpp получилась такая картина. Нужно ли показывать в программе как работают гетеры и сетеры в main, или они просто должны быть как методы доступа к закрытым полям в хорошей программе.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iomanip>
 
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    float m;
    Matrix m1(2); 
    std::cin >> m1;// перегруженная операция ввода
    Matrix m2(2);
    std::cout << "Введите цифру,на которую умножим и разделим матрицу"<<std::endl;
    std::cin >> m;
    m2 = m1 * m;// перегруженная операция *
    std::cout<< "Результаты после умножения матрицы на число. "<< m2; // перегруженная операция вывода
    m2 = m2 / m;// перегруженная операция /
    std::cout << "Результаты после деления матрицы на число. "<< m2;
    std::cout << "Умножение матриц друг на друга:"<<std::endl;
    Matrix m3(2);
    std::cin >> m3;
    Matrix m4(2);
    std::cin >> m4;
    Matrix m5(2);
    m5 = m3 * m4;// [url]http://www.mathprofi.ru/deistviya_s_matricami.html[/url] пункт 5 "умножения матриц"
    std::cout << m5;
    std::cout << "Присвоим последней матрице, выведенной на экран, значение первой матрицы:"<<std::endl;
    m5 = m1;// перегруженная операция =
    std::cout << m5;
    system("pause");
    return 0;
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.05.2015, 20:30
Ответы с готовыми решениями:

Реализовать функции доступа к закрытым полям класса
Определен следующий класс : struct Cls { Cls(char c, double d, int i); private: char c; double d; int i; ...

Почему у методов класса есть доступ к закрытым полям другой переменной такого же типа?
Привет всем. Объясните, кто знает, почему есть доступ к приватным полям аргумента такого же типа в методе класса. class Point { ...

Сеттеры и геттеры в классах С++!
Сдравствуйте!Не могли бы вы мне обьяснить зачем нужны сеттеры и геттеры в классах с++ и как их использовать в основной функции!Заранее...

13
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
07.05.2015, 20:33
Цитата Сообщение от lenarano Посмотреть сообщение
C++
1
float Matrix::**getm_ptr()
C++
1
float** Matrix::getm_ptr()
0
2 / 2 / 2
Регистрация: 12.04.2014
Сообщений: 102
07.05.2015, 20:38  [ТС]
Ругается на set функцию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Matrix::setm_size(size_t mat )
{
    m_size = mat;
} 
void **Matrix::setm_ptr(float **pmat)
{   m_ptr=pmat;//ругается объявление несовместимо
}
size_t Matrix::getm_size() 
{
    return  m_size;
}
 
float **Matrix::getm_ptr()
{   return  m_ptr;
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
07.05.2015, 20:40
Если ты к этим полям доступ даёшь, зачем они вообще в секции private?
0
2 / 2 / 2
Регистрация: 12.04.2014
Сообщений: 102
07.05.2015, 20:46  [ТС]
Они же закрыты. Я читала про такие функции. А что не так. Я же их уже защитила тем, что они не public
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
07.05.2015, 20:51
Ну я и говорю: ты их защищаешь, а потом создаёшь функции, которые делают их доступными.
0
2 / 2 / 2
Регистрация: 12.04.2014
Сообщений: 102
07.05.2015, 21:03  [ТС]
вроде бы вот так нужно. Правильно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Matrix::setm_size(size_t mat )
{
    m_size = mat;
} 
void Matrix::setm_ptr(float **pmat)
{   m_ptr=pmat;//ругается объявление несовместимо
}
size_t Matrix::getm_size() 
{
    return  m_size;
}
 
float **Matrix::getm_ptr()
{   return  m_ptr;
}
Добавлено через 6 минут
Но тогда и методы класса и дружественные функции тоже имеют доступ к этим полям. Я про них читала мне кажется у Шилдта да и в нете встречала. Я тоже считала, что они не нужны и реализовала без них, но препод попросил их добавить, что бы класс стал "правильным". Может будут еще мнения...
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
07.05.2015, 21:22
Цитата Сообщение от lenarano Посмотреть сообщение
Я тоже считала, что они не нужны и реализовала без них, но препод попросил их добавить, что бы класс стал "правильным". Может будут еще мнения...
геттер и сеттер реализует то,что вы хотите и как хотите.А с публичным полем можно делать что угодно.Так что лучше делайте.

Ну и общепринятый совет: опираться на требования к задаче.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.05.2015, 22:01
lenarano, при создании подобных классов матриц имеет смысл предоставлять удобный интерфейс для доступа к элементам, а не открывать путь к внутренней реализации. Т.о. getSize() ещё обоснован, а вот getPtr() довольно сомнителен.
P.S. Методы, не меняющие логическое состояние объекта следует объявлять константными:
C++
1
size_t Matrix::getm_size() const;
0
2 / 2 / 2
Регистрация: 12.04.2014
Сообщений: 102
07.05.2015, 22:24  [ТС]
да, согласна. Возможно есть логика в том, чтобы доступа к указателю не было. По поводу const не совсем поняла. Т.е. это поле мы хотим, чтобы было неизменным и поэтому защищаем от изменений. Это сказали?)))
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
07.05.2015, 22:28
lenarano, явно указываете,что в этом методе объект не изменит своего состояния(значения).
1
2 / 2 / 2
Регистрация: 12.04.2014
Сообщений: 102
07.05.2015, 22:34  [ТС]
еще хотела спросить.Предположим, что мы хотим бросить исключение, чтобы m_saze не был отрицательным. Реализовали это в
C++
1
2
3
4
5
6
void Matrix::Setm_size(size_t size )
{  
    if(size < 0)
throw std::exception ("'m_size' не может принимать отрицательные значения!");
m_size = size;
}
Теперь хочу, чтобы это же исключение срабатывало в конструкторах и хочу вставить не m_size, а Setm_size в конструкторе. Что мне поменять в конструкторе, чтобы было правильно? Я понимаю, что нужно наверное изменить, что то в конструкторе с параметром, а остальное оставить как есть. Но не понимаю, куда вставить функцию Setm_size в конструктор, чтобы сработало исключение.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Matrix::Matrix() : m_size(0),m_ptr(0) {} // конструктор по умолчанию
Matrix::Matrix( size_t matrixSize) : m_size(matrixSize) // конструктор с параметрами
{
    m_ptr = new float*[m_size];
    for ( int i = 0; i < m_size; i++ )
    {
        m_ptr[i] = new float[m_size];
    }
    for ( int i = 0; i < m_size; i++ )
        for ( int j = 0; j <m_size; j++ )
        {
            m_ptr[i][j]=0.0;
        }
}
Matrix::Matrix(const Matrix &ob) // конструктор копии
{ 
    m_size = ob.m_size; 
    m_ptr = new float*[m_size]; 
    for ( int i = 0; i < m_size; ++i) 
        m_ptr[i] = new float[m_size]; 
    for ( int i = 0; i < m_size; ++i) 
        for ( int j = 0; j < m_size; ++j) 
            m_ptr[i][j] = ob.m_ptr[i][j];
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
07.05.2015, 23:01
Просто вставь такую же проверку в конструктор.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.05.2015, 23:21
Цитата Сообщение от lenarano Посмотреть сообщение
еще хотела спросить.Предположим, что мы хотим бросить исключение, чтобы m_saze не был отрицательным. Реализовали это в
C++
1
2
3
4
5
6
void Matrix::Setm_size(size_t size )
{ *
* * if(size < 0)
        throw std::exception ("'m_size' не может принимать отрицательные значения!");
    m_size = size;
}
есть одно мудрое правило, как писать качественный софт:
"сделайте так, что бы то, чего быть не должно, не смогло возникнуть в принципе".


количество яблок не может быть отрицательным.
количество элементов массива тоже не может быть отрицательным.
размер матрицы не может быть отрицательным.

и не сможет быть в принципе, потому что тип данных size_t - беззнаковый.

в этом смысле вы очень правильно использовали size_t

однако, условие:
C++
1
if(size < 0)
у вас получается избыточное.

потому что переменная size никогда не будет меньше нуля.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.05.2015, 23:21
Помогаю со студенческими работами здесь

Константы, геттеры/сеттеры и производительность
Есть глобальная константа, определяющая размер большого количества массивов. Также есть множество обращений к массивам с использованием...

Как реализовать изменение полей классов через сеттеры и геттеры
#pragma once #include&lt;iostream&gt; class clock_c { protected: char *name; int god_proizvodstva; public: ...

Нормально ли размещать геттеры, сеттеры, прочие методы из 1 строчки в .h файлах?
Скажите, нормальная ли это практика в c++ помещать геттеры, сеттеры, всякие проверки (например, isInitialized) и прочие методы содержащие...

Дружественная функция-оператор, доступ к закрытым полям класса
У меня есть класс MyClass, вот код: class MyClass { int x, y; public: MyClass(); friend ostream &amp; operator &lt;&lt;...

Получение доступа к закрытым методом класса
Как получить доступ к закрытому конструктору и деструктору?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru