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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Немогу разобраться, почему выводит каждое число по 20 раз? http://www.cyberforum.ru/cpp-beginners/thread801128.html
Ну суть ясна в названии, программировал в Borland C++ for DOS Код: #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <math.h> void main() { clrscr();
C++ Получить доступ к переменной класса при наличии такого же имени переменной в функции Например, есть приватная переменная clientName в классе. Также есть точно такая же переменная в конструкторе этого класса. И мне нужно присвоить то значение переменной класса, которое имеет эта... http://www.cyberforum.ru/cpp-beginners/thread801097.html
C++ Програмное обеспичение различных ЕОМ
Требуется решить задачу с использованием классов и функций. Вывести ведомость про программное обеспечение различных ЕОМ, которые находятся в институтском вычислительном центре. Какие ЕОМ могут...
C++ быстрая сортировка
Ребят, делаю сортировку четных строк матрицы методом быстрой сортировки. Все сорртируется правильно, но, когда программа доходит до последнего элемента массива, она превращает его в мусор. Никак не...
C++ Многомерный массив(ошибки в коде) http://www.cyberforum.ru/cpp-beginners/thread801063.html
Здравствуйте. Необходимо было написать программу: Для матрицы из 3 столбцов и 7 строк определить номера строк где третий элемент больше суммы двух других элементов строки и число таких строк....
C++ Подключение динамического массива и файла #include <stdio.h> #include<conio.h> #include<iostream> /********************************************************************/ #define MAX_WIDTH 3 #define MAX_HEIGHT 4 using namespace... подробнее

Показать сообщение отдельно
Tolias28
206 / 123 / 2
Регистрация: 18.08.2010
Сообщений: 1,011

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

05.03.2013, 13:58. Просмотров 788. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.