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

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

07.05.2015, 20:30. Показов 4701. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru