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

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

Войти
Регистрация
Восстановить пароль
 
Tolias28
206 / 123 / 2
Регистрация: 18.08.2010
Сообщений: 1,011
#1

Как разумно получить доступ к приватной переменной - C++

05.03.2013, 13:58. Просмотров 789. Ответов 8
Метки нет (Все метки)

Есть в классе приватная переменная clientName. Мне нужно защитить ее так, чтобы для внешних классов она была только для чтения. Не получается. Например, следующий код не спасает:
Попытка №1
C++
1
2
3
4
5
6
7
8
9
10
11
class Client
{
private:
    wchar_t clientName[20];
 
public:
    wchar_t* getClientName()
    {
        return clientName;
    }
};
Потому что функция getClientName() возвращает указатель, которому если присвоить другой массив, тогда в переменной clientName класса будет содержаться уже совсем другая строка. То есть, уже нету защиты от записи извне.
C++
1
2
3
4
Client* c = new Client(L"test_client");
wchar_t* clName = c->getClientName();
wcscpy(clName, L"overrode client name");
wchar_t* checkClientName = c->getClientName(); //здесь функция возвратит уже совсем другую строку "overrode client name", а не "test_client"
Попытка №2
в функции getClientName() создавать новую строку, копировать в нее строку clientName и возвращать.
C++
1
2
3
4
5
6
wchar_t* getClientName()
{
    wchar_t tempClientName[20];
    wcscpy_s(tempClientName, clientName);
    return tempClientName;
}
На этот раз все вроде работает. Но компилятор предупреждает:
warning C4172: returning address of local variable or temporary
И правильно предупреждает. В моей практике уже было такое, что при возвращении адресса локальной переменной в этом адресе впоследствии содержалась не строка, а муссор. Значит этот способ тоже отпадает.

Попытка №3
Все то же самое, что во втором способе, только выделять память динамически
C#
1
2
3
4
5
6
wchar_t* getClientName()
{
    wchar_t* tempClientName = new wchar_t[20];
    wcscpy_s(tempClientName, 20, clientName);
    return tempClientName;
}
Этот способ пашет. НО! после каждого вызова функции getClientName() придется самостоятельно очищать память:
C++
1
2
3
wchar_t* clName = c->getClientName();
std::wcout << "Client name: " << clName;
delete(clName);
А это чрезвычайно неудобно и к тому же невозможно например в этом случае:
C++
1
std::wcout << "Client name: " << c->getClientName();
Ну и вот как здесь очистить память?


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

Получить доступ к переменной класса при наличии такого же имени переменной в функции - C++
Например, есть приватная переменная clientName в классе. Также есть точно такая же переменная в конструкторе этого класса. И мне нужно...

Использование приватной переменной - C++
#include&lt;iostream&gt; #define N 100 using namespace std; class Mass { private: int a,n; public: Mass() ...

Получить доступ к локальной переменной другой функции - C++
Что не так?Можно ли тут обойтись без указателя? #include &lt;iostream&gt; using namespace std; int a = 0; void m(void) { extern int b;...

Как получить доступ к элементам массива работая с ним как с указателем и адресной арифметикой - C++
int array = { {1,2,3}, {1,2},{1,2,3,4}, {1,2,3,4},{1,2,},}; for(int i = 0; i &lt; 25; i++) printf(&quot;%d &quot;, array); ...

Как получить доступ к указателю __vfptr - C++
P.S. У меня VisualStudio

Как получить доступ к приватному полю - C++
Всем доброго времени суток! Есть такое задание: нужно написать класс, который помимо всего прочего состоит из объекта еще одного класса, в...

8
Байт
Нарушитель
Эксперт C
16694 / 10958 / 1687
Регистрация: 24.12.2010
Сообщений: 21,379
05.03.2013, 14:01 #2
C++
1
2
3
4
5
6
wchar_t* getClientName()
{
    static wchar_t tempClientName[20];
    wcscpy_s(tempClientName, clientName);
    return tempClientName;
}
static wchar_t tempClientName[20];
1
Tolias28
206 / 123 / 2
Регистрация: 18.08.2010
Сообщений: 1,011
05.03.2013, 14:04  [ТС] #3
Байт, спасибо большое! Я сколько сидел и голову ломал, как это сделать, а как все просто, оказывается
0
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
05.03.2013, 14:05 #4
Код
const wchar_t* getClientName() const;
1
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
05.03.2013, 14:05 #5
Указатель на константу?
C++
1
2
3
4
wchar_t const* getClientName() const
{
    return clientName;
}
1
Andrew_Lvov
05.03.2013, 14:06
  #6

Не по теме:

gray_fox, что ж вы такой медлительный ? До вас уже ответили! )))

0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
05.03.2013, 14:08 #7
Использовать string, если уж на С++ пишете. И возвращать по значению/const ссылке.
1
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 14:13 #8
При всем уважении к варианту выше, не лучше ли так?
C++
1
2
3
4
    const wchar_t* getClientName() const
    {
        return clientName;
    }
Никаких копий и вечно живущих до конца программы массивов. Никаких накладных расходов на копирование.
Функция вернет указатель, позволяющий только лишь читать данные по адресу. Мне кажется - самый изысканный способ решить проблему.
P.S. Тьфу! Опять опоздал!
1
gray_fox
05.03.2013, 14:15     Как разумно получить доступ к приватной переменной
  #9

Не по теме:

Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
gray_fox, что ж вы такой медлительный ? До вас уже ответили! )))
Ok (
)

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2013, 14:15
Привет! Вот еще темы с ответами:

Как получить доступ к элементам вектора - C++
Нашел вот такой код. А вот как получить доступ к элементам вектора? FILE *ToWrite = fopen(&quot;C:\\result.txt&quot;, &quot;w+&quot;); list&lt;string&gt;...

Как получить биты переменной? - C++
Есть ли какие-то встроенные средства, с помощью которых можно определить какие биты содержит в себе переменная? Потому что cout выводит уже...

Как получить доступ к членам класса из функций - C++
Есть код типа //***************************************************************************** func1() { body; } func2() ...

Как получить доступ к элементов структуры по указателю (С++)? - C++
Как можно получить доступ к элементам структуры? Есть указатель на void * ( указывает на определенную структуру ). Пример: struct...


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

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

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