213 / 137 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
1

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

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

Author24 — интернет-сервис помощи студентам
Есть в классе приватная переменная 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2013, 13:58
Ответы с готовыми решениями:

Получить доступ из метода к приватной статической переменной и изменить ее
Добрый день как можно получить доступ из метода в приватный статическую переменную и изменить его....

Как получить значение приватной переменной из другого класса?
Например есть код: class B { private int i = 22; } class A { // тут код который...

Имя переменной как переменная. Как получить доступ к такой переменной?
Подскажите как получать данные из переменной, если ее имя вычисляется? И соответственно как потом...

Как получить доступ к переменной?
Делаю игру(гонки),начал писать скрипт для спидометра Speedemeter(C#),почти закончил,но понял,что не...

8
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
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
213 / 137 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
05.03.2013, 14:04  [ТС] 3
Байт, спасибо большое! Я сколько сидел и голову ломал, как это сделать, а как все просто, оказывается
0
Эксперт С++
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
05.03.2013, 14:05 4
Код
const wchar_t* getClientName() const;
1
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
05.03.2013, 14:08 7
Использовать string, если уж на С++ пишете. И возвращать по значению/const ссылке.
1
Эксперт С++
177 / 163 / 21
Регистрация: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2013, 14:15

Как получить доступ к переменной?
Дано натуральное число n. Выяснить, сколько положительных элементов содержит матрица A размерности...

Как получить доступ к переменной?
не могу получить значение переменной username

Как получить доступ к переменной из блока if
Столкнулся со странной проблемой, с которой нигде и никогда не сталкивался при других...

Как получить доступ к переменной класса?
есть класс формы с публичными перменными public ref class Form1 : public...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru