Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

Дружественная функция не имеет доступа к приватным членам - 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++
Здравствуйте. тока начал изучение С++; составляю прогу практически по учебнику - реализация класса Стринг при компиляции компилятор...

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

Доступ к членам класса - C++
Объект класса не может получить доступ к своим переменным?

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

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

Кстати, если вернуть const char*, то ты точно так же сможешь их модифицировать, преобразовав результат в char*
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 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;
  }
 
  //...
}
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2011, 12:11 #8
Цитата Сообщение от Evg Посмотреть сообщение
преобразовав результат в char*
Да, пичалька.
0
silent_1991
02.04.2011, 14:52
  #9

Не по теме:

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

0
Evg
Эксперт CАвтор FAQ
18377 / 6424 / 441
Регистрация: 30.03.2009
Сообщений: 17,815
Записей в блоге: 28
02.04.2011, 15:02 #10
silent_1991, тут просто есть две разные вещи, разницу между которым ТС наверное не очень понимает: спрятать поле класса и спрятать строку, на которое указывает поле. Всё остальное появилось в процессе обсуждения этих вещей
1
02.04.2011, 15:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2011, 15:02
Привет! Вот еще темы с ответами:

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

Callback std::function + доступ к приватным полям класса методам которые не есть их полями - C++
Проблема, товарищи. В прикрепленном архиве 3 файла, из которых состоит моя программа: **main.cpp; prototypes.h; realization.cpp** 1....

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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