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

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

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

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

02.04.2011, 01:33. Просмотров 1509. Ответов 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 ?

П.С. прошу прощения за то что не соблюдал пунктуацию и грамматику ...
просто спать хочу глаза закрываются и еще не грамотный я )))хи)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2011, 01:33     Доступ к приватным членам
Посмотрите здесь:

Дружественная функция не имеет доступа к приватным членам - C++
Добрый день. Возникла такая проблема: при обращении в теле дружественной функции класса к его приватному члену возникают ошибки "...

Std::thread. Почему можно обращаться к приватным членам объекта в другом потоке? - C++
#include <iostream> #include <thread> #include <mutex> #include <iomanip> using namespace std; class TestThread{ public:...

Доступ к приватным полям, используя множественное наследование - C++
Здравствуйте. Имею класс A и класс B. В классе A в приватном поле объявляется переменная data типа int: class A { private: int...

Доступ дружественного оператора к приватным данным класса - C++
Здравствуйте. тока начал изучение С++; составляю прогу практически по учебнику - реализация класса Стринг при компиляции компилятор...

Доступ к членам класса - C++
Есть два класса: #include "stdafx.h" #include <iostream> using namespace std; class CPerson { /*закрытые члены*/ private:...

доступ к private членам - C++
Здравстуйте. недавно нарвался на непонятное мне поведение в С++. Вот код: #include <iostream> class A { private: int x; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4961 / 3037 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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
17551 / 5789 / 370
Регистрация: 30.03.2009
Сообщений: 15,940
Записей в блоге: 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
17551 / 5789 / 370
Регистрация: 30.03.2009
Сообщений: 15,940
Записей в блоге: 26
02.04.2011, 11:57     Доступ к приватным членам #6
Цитата Сообщение от Deviaphan Посмотреть сообщение
Но данные, на которые указывает указатель, поменять ничто не помешает.)
Данные, куда смотрит указатель, вообще не являются свойством класса. И уж тем более это свойство никак не зависит от того, private у нас указатель, или public. К тому же уточняющий вопрос по этому поводу я задал

Кстати, если вернуть const char*, то ты точно так же сможешь их модифицировать, преобразовав результат в char*
CyBOSSeR
Эксперт C++
2300 / 1670 / 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++
Объект класса не может получить доступ к своим переменным?

Доступ к private членам класса - C++
Почему при таком объявлении не работает оператор вывода, по идее он же объявлен как друг класса и должен иметь доступ к членам этого...

Перегрузка операторов и доступ к закрытым членам - C++
Поясните, пожалуйста, почему, когда при перегрузке операторов, елис как аргумент передается ссылка на обьект класса, то через эту ссылку мы...

Доступ к закрытым членам базового класса - C++
помогите понять что я не так сделал ? #include &lt;iostream&gt; using namespace std; class A { int PrA1; public: int...


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

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

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