Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 1
Регистрация: 19.12.2019
Сообщений: 22

Геттеры и сеттеры

22.07.2020, 04:13. Показов 3414. Ответов 11

Студворк — интернет-сервис помощи студентам
Здравствуйте! Подскажите как правильно реализовать методы get и set для полей char[]?
C++
1
2
3
4
private:
    char _name[50];
    char _author[50];
    float _cost;
Правильно ли я сделал, нас примере поля _name:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void setName(char* name)
    {
        if (strlen(name) > 0)
        {
            this->name = new char[strlen(name) + 1];
            strcpy(this->_name, name);               
        }
    }
 
char* getName()
    {
        return _name;
    }
И еще не могу понять почему нельзя setName сделать константным? компилятор говорит о несоответствии типа возвращаемого значения, но при этом такой же set для float норм работает.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.07.2020, 04:13
Ответы с готовыми решениями:

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

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

Написать геттеры и сеттеры для простого класса
Cоздадим простой класс, в котором будет только имя персонажа и его здоровье. Имя и текущее здоровье будут как выводиться, так и изменяться,...

11
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.07.2020, 04:20
Цитата Сообщение от Pravednic Посмотреть сообщение
C++
1
char _name[50];
Это на стеке память выделяется, а это в куче:
Цитата Сообщение от Pravednic Посмотреть сообщение
C++
1
this->name = new char[strlen(name) + 1];
Что-то одно нужно выбрать.

Добавлено через 2 минуты
Или поле указатель, а не массив, или память в куче не нужно выделять, а сразу делать копирование в массив (проверив, достаточно ли места).
0
0 / 0 / 1
Регистрация: 19.12.2019
Сообщений: 22
22.07.2020, 16:08  [ТС]
Сделал вот так, компилятор ошибок не видит:
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
void setName(char* name)
    {
        name = _name;
    }
    char* getName()
    {
        return _name;
    }
    void setAuthor(char* author)
    {
        author = _author;
    }
    char* getAuthor()
    {
        return _author;
    }
    void setCost(float cost)
    {
        _cost = cost;
    }
    float getCost()const
    {
        return _cost;
    }
А в параметрах метода правильно указывать тип со *, у меня ведь [] ?
И почему-то нельзя setName и setAuthor сделать const?
0
Она кричала хватит
 Аватар для live_4_ever
41 / 42 / 7
Регистрация: 21.05.2019
Сообщений: 112
22.07.2020, 16:43
Цитата Сообщение от Pravednic Посмотреть сообщение
void setName(char* name)
    {
        name = _name;
    }
Для си-строк всегда используй strcpy или strncpy.

Цитата Сообщение от Pravednic Посмотреть сообщение
А в параметрах метода правильно указывать тип со *, у меня ведь [] ?
* это одно и тоже что и [].

Добавлено через 4 минуты
Вместо arr[i] ты можешь написать *(arr+i)

Добавлено через 3 минуты
Цитата Сообщение от live_4_ever Посмотреть сообщение
* это одно и тоже что и [].
Сам себя поправлю: не совсем. Все же указатель и массив все таки отличаются друг от друга.
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
22.07.2020, 16:48
Цитата Сообщение от live_4_ever Посмотреть сообщение
Все же указатель и массив все таки отличаются друг от друга.
В параметре функции таки это действительно одно и тоже и всегда обозначает указатель.
C++
1
2
3
void foo(char a[]);
void foo(char* a);
void foo(char a[256]);
Это все объявления одной и той же функции - принимающей указатель на char.
0
0 / 0 / 1
Регистрация: 19.12.2019
Сообщений: 22
22.07.2020, 16:52  [ТС]
Цитата Сообщение от live_4_ever Посмотреть сообщение
Для си-строк всегда используй strcpy или strncpy.
значит в сеттере вот так надо: strcpy(this->name, _name); ?
0
Она кричала хватит
 Аватар для live_4_ever
41 / 42 / 7
Регистрация: 21.05.2019
Сообщений: 112
22.07.2020, 17:08
Цитата Сообщение от Pravednic Посмотреть сообщение
значит в сеттере вот так надо: strcpy(this->name, _name); ?
Не совсем. Можешь не использовать указатель this тогда:

C++
1
2
3
4
5
6
7
void SetName(const char* _name)
    {
        if (strlen(_name) > 0)
        {
            strcpy(name, _name);                
        }
    }
А компилятор будет ругаться скорее всего на небезопасное использование strcpy. Тебе нужно добавить исключение или использовать "безопасную" функцию strncpy (добавить макс. количество копируемых символов).

Добавлено через 2 минуты
Почитай информацию как пользоваться функциями для работы со си-строками
1
0 / 0 / 1
Регистрация: 19.12.2019
Сообщений: 22
22.07.2020, 17:13  [ТС]
А как в моем случае можно сделать сеттеры константными? и можно ли вообще? Препод говорит, что что-то из сеттеров и гетерой должно быть const, только не знаю что
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.07.2020, 17:19
Цитата Сообщение от Pravednic Посмотреть сообщение
Сделал вот так, компилятор ошибок не видит:
Компилятор многие ошибки не видит.
Цитата Сообщение от Pravednic Посмотреть сообщение
C++
1
name = _name;
Это что чему ты присваиваешь?
0
Она кричала хватит
 Аватар для live_4_ever
41 / 42 / 7
Регистрация: 21.05.2019
Сообщений: 112
22.07.2020, 17:20
Цитата Сообщение от Pravednic Посмотреть сообщение
А как в моем случае можно сделать сеттеры константными? и можно ли вообще? Препод говорит, что что-то из сеттеров и гетерой должно быть const, только не знаю что
Делать геттеры константными не имеет смысла. Под "сделать сеттеры константными" скорее всего твой препод подразумевает метод setName будет принимать константные параметры. То есть:
C++
1
void SetName(const char* _name)
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.07.2020, 17:20
Цитата Сообщение от Pravednic Посмотреть сообщение
Препод говорит, что что-то из сеттеров и гетерой должно быть const, только не знаю что
Геттеры. Сеттер меняет объект, поэтому не может быть const.
0
317 / 268 / 61
Регистрация: 12.10.2011
Сообщений: 434
22.07.2020, 17:47
C++
1
2
void Cost(const float cost) { _cost = cost; }
float Cost() const { return _cost; }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.07.2020, 17:47
Помогаю со студенческими работами здесь

Реализация методов доступа к закрытым полям (геттеры и сеттеры)
Здраствуйте. Нужно реализовать в программе методы get и set Вот мой код: Заголовочный файл #include <iomanip> class Matrix...

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

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

Геттеры и геттеры - почитать по этому поводу
Подскажите чего можно почитать по этому поводу чтоб доступно и понятно......спасибо))))) Добавлено через 46 минут :wall:

Геттеры и сеттеры
Всем привет , решал задачу с learn.js Решил ее, но до конца не разобрался почем в object.defineProperty должны работать с this, и...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
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, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru