Будет ли возможность публичной функции возвращать указатель на приватную переменную в классе. Если так/если нет, что произойдет? это будет крушение или есть что-то очень опасное в этом отношении? Можно ли прочитать или записать указанные данные? ThanksДоступ к частной переменной через свой адрес?
ответ
Да, функция-член может возвращать указатель (или ссылку) частному элементу данных. Нет ничего неправильный с этим, за исключением того, что в большинстве случаев он прерывает инкапсуляцию.
Элемент данных, безусловно, может быть прочитан через возвращаемый указатель или ссылку. Независимо от того, может ли оно быть записано, зависит от того, является ли возвращаемый указатель или ссылка объекту с контеном (т. Е. Если вы вернете const T*
, вы не сможете изменить указатель на T
). Например:
class Example
{
public:
int* get() { return &i; }
const int* get_const() const { return &i; }
private:
int i;
};
int main()
{
Example e;
int* p = e.get();
int a = *p; // yes, we can read the data via the pointer
*p = 42; // yes, we can modify the data via the pointer
const int* cp = e.get_const();
int b = *cp; // yes, we can read the data via the pointer
*cp = 42; // error: pointer is to a const int
}
Да, он может быть возвращен, и его можно прочитать и записать. Это не более или менее опасно, чем обращение к любой другой переменной. Public/private/protected - синтаксические конструкции, которые проверяются во время компиляции, и они не являются «заразными» или частью типа чего-то.
Личный член ничем не отличается от открытого участника или любого другого экземпляра. Итак, да, вы можете взять с ними указатели и вернуть их.
При наведении указателей на любой член на основе экземпляра вы должны быть осторожны, чтобы родительский класс не удалялся и не выходил за пределы области видимости, если вы не указали этот указатель и не сделали истинную копию данных/объекта это указывает на. Если он удален или выходит из области видимости, указатель становится висящим указателем, и вы больше не сможете его использовать без взлома приложения (или работы с несуществующими объектами и, таким образом, сделать вашу программу сумасшедшими неожиданными вещами, но не сбой).
Дизайн соображения:
Разоблачение любой из ваших внутренних деталей реализации потенциально является нарушением инкапсуляции. Тем не менее, если вы хотите только инкапсулировать, КАК возвращается или создается объект, который вы возвращаете, это разумное решение. Это позволит вам изменить класс, чтобы получить объект-член каким-либо другим способом (например, запрос файла или внутреннего словаря) без нарушения кода, который вызывает эти методы.
«Было бы крушение или есть что-то очень опасное в этом вопросе? Можно ли прочитать или записать точные данные?»
частный/защищенный/общественный не имеет никакого эффекта при времени выполнения, поэтому они не могут влиять на выполнение программы или даже сбой программы. Они проверяются на времени компиляции и просто заставляют ваш компилятор выкидывать ошибку при компиляции, если есть нарушение.
Квалификатор const
не защитит вас в этих случаях. Учитывая ответ Джеймса, пожалуйста, попробуйте забрасывать const int *
к int *
int* cp = (int*)e.get_const();
вас будет все еще быть в состоянии изменить.
- 1. Доступ к частной переменной через общедоступное свойство
- 2. Доступ к частной переменной PHP
- 3. OLOO Как получить доступ к частной переменной
- 4. Доступ к частной переменной из другого класса?
- 5. Доступ к частной переменной из суперкласса (JAVA)
- 6. Java Enum доступ к частной переменной экземпляра
- 7. Доступ к частной переменной из другого класса
- 8. Доступ к частной переменной в подклассе
- 9. Java, доступ к частной собственности через Reflection
- 10. Доступ к частной собственности через метод
- 11. Доступ к частной переменным объектам
- 12. Доступ к частной переменной в категории приводит к ошибке компоновщика
- 13. Есть ли способ получить доступ к частной переменной-члену класса?
- 14. Как получить доступ к одной частной переменной экземпляра в ИОС
- 15. Доступ к частной переменной из другого класса в Java
- 16. доступ частной переменной без создания собственности
- 17. Доступ неинициализированный атомное частной переменной в C++
- 18. Доступ к mysql через URL-адрес
- 19. Доступ к частной переменной из других классов в Java
- 20. Scope в JavaScript, чтобы получить доступ к частной переменной
- 21. PHP: получить доступ к частной переменной в классе
- 22. Как получить доступ к частной переменной в другом классе Java
- 23. Доступ к частной переменной из категории генерирует ошибку компоновщика
- 24. Доступ к частной глобальной переменной в ASP.Net MVC
- 25. Как получить доступ к частной переменной родительского класса?
- 26. Доступ к частной переменной из внутреннего класса (AsyncTask)
- 27. Доступ к частной переменной класса модели без геттеров
- 28. Почему я не могу получить доступ к этой частной переменной?
- 29. как доступ к частной переменной экземпляра экземпляра в main()
- 30. Как получить доступ к частной переменной из метода?
См. Эффективный C++ Item 28. И +1. –
Этот подход опасен. Он может легко сбрасывать int * x = Example() .get(); удалить x; int * y = Пример().получить(); // Crashes –
@jack london: IMO, на C++, если вы собираетесь вообще заниматься ручным управлением памятью, вы просто не можете называть 'delete' на произвольных указателях и рассчитывать избежать этого. Если вы управляете памятью вручную, вы должны знать, что делаете. – UncleBens