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

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

Восстановить пароль Регистрация
 
Tolias28
202 / 117 / 2
Регистрация: 18.08.2010
Сообщений: 1,006
05.03.2013, 13:58     Как разумно получить доступ к приватной переменной #1
Есть в классе приватная переменная 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# - там таких проблем и близко нет. Можешь полостью сосредоточиться на логике программы. А здесь в плюсах приходится тратить уйму времени на сам код....)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2013, 13:58     Как разумно получить доступ к приватной переменной
Посмотрите здесь:

C++ Как получить доступ к указателю __vfptr
Использование приватной переменной C++
Получить доступ к переменной класса при наличии такого же имени переменной в функции C++
C++ Как получить доступ к элементам массива работая с ним как с указателем и адресной арифметикой
C++ Как получить доступ к членам класса из функций
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
13954 / 8785 / 1222
Регистрация: 24.12.2010
Сообщений: 15,901
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];
Tolias28
202 / 117 / 2
Регистрация: 18.08.2010
Сообщений: 1,006
05.03.2013, 14:04  [ТС]     Как разумно получить доступ к приватной переменной #3
Байт, спасибо большое! Я сколько сидел и голову ломал, как это сделать, а как все просто, оказывается
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
05.03.2013, 14:05     Как разумно получить доступ к приватной переменной #4
Код
const wchar_t* getClientName() const;
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
05.03.2013, 14:05     Как разумно получить доступ к приватной переменной #5
Указатель на константу?
C++
1
2
3
4
wchar_t const* getClientName() const
{
    return clientName;
}
Andrew_Lvov
05.03.2013, 14:06
  #6

Не по теме:

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

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.03.2013, 14:08     Как разумно получить доступ к приватной переменной #7
Использовать string, если уж на С++ пишете. И возвращать по значению/const ссылке.
ITcrusader
Эксперт C++
 Аватар для 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. Тьфу! Опять опоздал!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2013, 14:15     Как разумно получить доступ к приватной переменной
Еще ссылки по теме:

C++ Как получить доступ к строке введенной в форму?
Как получить доступ к приватному полю C++
C++ Как получить доступ к элементам вектора

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

Или воспользуйтесь поиском по форуму:
gray_fox
05.03.2013, 14:15     Как разумно получить доступ к приватной переменной
  #9

Не по теме:

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

Yandex
Объявления
05.03.2013, 14:15     Как разумно получить доступ к приватной переменной
Ответ Создать тему
Опции темы

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