Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Lelysh
0 / 0 / 0
Регистрация: 13.02.2010
Сообщений: 22
#1

Доступ к приватным членам - C++

02.04.2011, 01:33. Просмотров 1449. Ответов 9
Метки нет (Все метки)

доброго времени суток подскажите как мне правильно реализовать доступ.
Есть класс в нём приватными членами являются указатель на char
делая функции Set/Get с Sеt все нормально, возникает вопрос с Get
хочется написать по глупому
C++
1
2
3
4
char  *  GetSome()
{
return Some;//Some типа char * 
}
но это ведь будет ошибка так как some приватное поле и если мы вернем указатель на него то сможем его изменять вне класса. тогда теряется смысл делать его приватным(
2 вариант
C++
1
2
3
4
5
6
char * GetSome()
{
char * ReturnSome=new char [x];
strcpy(ReturnSome,Some);
return ReturnSome;
}
в этом варианте мы перед возвращением копируем значение в ReturnSome тоесть мы выделяем память под такое же значение..при большом количестве вызовов данной функции может и память не совсем хватить )
скажите как мне лучше реализовать доступ Some ?

П.С. прошу прощения за то что не соблюдал пунктуацию и грамматику ...
просто спать хочу глаза закрываются и еще не грамотный я )))хи)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4951 / 3027 / 149
Регистрация: 11.11.2009
Сообщений: 7,026
Завершенные тесты: 1
02.04.2011, 02:11     Доступ к приватным членам #2
Возвращайте const char *. Тогда компилятор не даст присвоить результат неконстантному char*, и, как следствие, изменить саму строку. Правда, можно заюзать const_cast и избавиться от этого... Так что других максимально защищённых способов, кроме как возвращать копию, я не вижу.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 07:15     Доступ к приватным членам #3
Цитата Сообщение от Lelysh Посмотреть сообщение
тогда теряется смысл делать его приватным(
Смысл инкапсуляции не только и не столько в этом.)

Прототип должен быть таким тогда:
C++
1
const char * GetSome() const
Evg
Эксперт CАвтор FAQ
17267 / 5521 / 344
Регистрация: 30.03.2009
Сообщений: 15,033
Записей в блоге: 26
02.04.2011, 11:15     Доступ к приватным членам #4
Цитата Сообщение от Lelysh Посмотреть сообщение
но это ведь будет ошибка так как some приватное поле и если мы вернем указатель на него то сможем его изменять вне класса
Ты возвращаешь НЕ указатель на поле, а значение поля (т.е. копию существующего указателя, который указывает на строку, а не на поле класса). Или речь всё-таки идёт не об указателе, а о строке, на которую смотрит указатель?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 11:49     Доступ к приватным членам #5
Цитата Сообщение от Evg Посмотреть сообщение
Ты возвращаешь НЕ указатель на поле, а значение поля
Но данные, на которые указывает указатель, поменять ничто не помешает.)
Evg
Эксперт CАвтор FAQ
17267 / 5521 / 344
Регистрация: 30.03.2009
Сообщений: 15,033
Записей в блоге: 26
02.04.2011, 11:57     Доступ к приватным членам #6
Цитата Сообщение от Deviaphan Посмотреть сообщение
Но данные, на которые указывает указатель, поменять ничто не помешает.)
Данные, куда смотрит указатель, вообще не являются свойством класса. И уж тем более это свойство никак не зависит от того, private у нас указатель, или public. К тому же уточняющий вопрос по этому поводу я задал

Кстати, если вернуть const char*, то ты точно так же сможешь их модифицировать, преобразовав результат в char*
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
02.04.2011, 12:06     Доступ к приватным членам #7
Lelysh,
Вариант 1 (естественный для C++):
C++
1
2
3
4
5
6
7
8
9
10
11
// Не стоит использовать строки в стиле Си в C++
class Foo {
  std::string bar;
 
public:
  const std::string getBar() const {
    return bar;
  }
 
  //...
};
Вариант 2 (танцы с бубном обеспечены):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Foo {
  char* bar;
 
public:
  const boost::shared_array<char> getBar() const {
    boost::shared_array<char> result(new char[std::strlen(bar) + 1]);
    
    std::strcpy(result.get(), bar);
    
    return result;
  }
 
  //...
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 12:11     Доступ к приватным членам #8
Цитата Сообщение от Evg Посмотреть сообщение
преобразовав результат в char*
Да, пичалька.
silent_1991
02.04.2011, 14:52
  #9

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
ты точно так же сможешь их модифицировать, преобразовав результат в char*
О чём я и сказал во втором сообщении)))

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2011, 15:02     Доступ к приватным членам
Еще ссылки по теме:

C++ Callback std::function + доступ к приватным полям класса методам которые не есть их полями
Доступ к членам одного класса с другого C++
C++ Доступ дружественного оператора к приватным данным класса
C++ Доступ к членам класса
C++ Доступ к закрытым членам класса(шаблона)

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17267 / 5521 / 344
Регистрация: 30.03.2009
Сообщений: 15,033
Записей в блоге: 26
02.04.2011, 15:02     Доступ к приватным членам #10
silent_1991, тут просто есть две разные вещи, разницу между которым ТС наверное не очень понимает: спрятать поле класса и спрятать строку, на которое указывает поле. Всё остальное появилось в процессе обсуждения этих вещей
Yandex
Объявления
02.04.2011, 15:02     Доступ к приватным членам
Ответ Создать тему
Опции темы

Текущее время: 19:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru