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

Protected Private Public - C++

Восстановить пароль Регистрация
 
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
07.07.2013, 18:25     Protected Private Public #1
Возник вопрос, немного наверное бредовый и на практике наврятли применимый, но всё же интересно, а возможно поменять модификатор доступа в классе? Не допустим:
Вот есть у нас класс (у меня нету возможности поменять ручками в коде модификатор доступа):
C++
1
2
3
4
5
6
class A
{
private:
    int a;
    int Add(int b);
};
А мне вот приспичело воспользоваться методом 'Add'.
Есть идея обернуть класс в класс и сделать их друзьями, и получу доступ к private данным.
А вот есть ли что-то другое?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
07.07.2013, 18:29     Protected Private Public #2
Wolkodav, ну если только добавить в этот класс возвращение ссылки поля private. Типа того:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class A
{
private int a;
int *get() {return &a;}
};
 
void main()
{
A a;
int *x = a.get();
*x = 10000;
}
Но это изврат. На деле, если поле private, то это значит, что его НИКТО, кроме методов самого класса использовать не будет, иначе делай protected или public. В противном случае смысла в спецификаторе "private" вообще не было бы
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
07.07.2013, 18:32  [ТС]     Protected Private Public #3
nexen, я же сказал, бредовый вопрос. А если ну не могу я менять исходный класс?
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
07.07.2013, 18:33     Protected Private Public #4
Wolkodav, я же сказал - никак.
Хотя можно ещё сильнее извратиться и, если есть public-поля, то с помощью арифметики на указателях добраться до этих полей. Возможно это можно сделать даже при помощи методов и их размещения в памяти, но тут я уже не знаю
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
07.07.2013, 18:35     Protected Private Public #5
C++
1
2
3
4
5
6
7
8
9
10
#define private public
 
class A
{
private:
    int a;
    int Add(int b);
};
//...
#undef private
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
07.07.2013, 18:37  [ТС]     Protected Private Public #6
rangerx, зачтено)

Добавлено через 23 секунды
nexen, хм, а вот это уже интересней)

Добавлено через 24 секунды
nexen, т.е. по адресу я могу обратиться к private данным?
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
07.07.2013, 18:43     Protected Private Public #7
Wolkodav, вот тут я точно не знаю. Вроде это и от упаковки класса зависит и от компилятора.. (повторюсь, не знаю)

Попробуй:
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
private int a;
public int b;
};
 
void main()
{
A a;
*(&a.b - sizeof(int)) = 100;
}
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
07.07.2013, 18:45  [ТС]     Protected Private Public #8
nexen, а это интереснее, надо будет побаловаться.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.07.2013, 18:49     Protected Private Public #9
Wolkodav, На самом деле - этот момент отлично рассматривается у Саттера "Новые сложные задачи на С++" Задача 15. Кому лень читать - опишу примеры тут.

Стандартный вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
 
class A
{
    int a;
public:
    A() : a(0) {}
    int get() { return a; }
    template<typename T>
    void function() {}
};
 
struct dummy {};
 
template<>
void A::function<dummy>()
{
    a = 500;
}
 
int main()
{
    A a;
    std::cout << a.get() << std::endl;
    a.function<dummy>();
    std::cout << a.get() << std::endl;
}
https://ideone.com/iS1ghd

Хак

Создаем новый файлик, в нем определяем наш класс с тем же именем и ровно тем же составляющим, добавляя некую friend функцию.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// X.h
 
class X
{
int value;
};
 
// X_h.h
 
class X
{
int value;
friend ::hack(X&);
};
 
void hack(X&) { x.a = 5; }


Хак
C++
1
2
3
#define private public
//
#undef private

Хак
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class X
{
int a;
};
 
class HackX
{
public:
   int not_private;
};
 
void f(X& x)
{
   (reinterpret_cast<HackX&>(x)).not_private = 500;
}
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
07.07.2013, 18:58     Protected Private Public #10
ForEveR, не могу понять, что тут такого? Разве тут не простое изменения поля шаблонным методом? Или я что-то упускаю?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.07.2013, 19:07     Protected Private Public #11
nexen, Специализация-то может находится где угодно. Это просто возможность доступа к private данным на самом деле извне, но технически из класса.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
07.07.2013, 19:09     Protected Private Public #12
ForEveR, ах вот вы о чем.. Но почему тогда нужен был именно шаблон? Я имею ввиду, что:
C++
1
2
3
4
5
6
7
8
9
10
class A
{
int a;
public:
void set(int);
};
void A::set(int x)
{
a = x;
}
тоже сработает
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.07.2013, 19:18     Protected Private Public #13
nexen, ODR. Если функция уже определена - ее не переопределить.
А шаблон притом, что специализация функции - является такой же функцией-членом, как и все остальные функции, однако определена может быть где угодно и для какого угодно типа.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class X
{
public:
   template<typename T>
   void some_usefull_function(T&) {}
private:
   int private_value;
};
 
// user code
 
namespace { struct dummy {}; }
template<>
void X::some_usefull_function(dummy&)
{
   private_value = 100500;
}
 
int main()
{
   X x;
   dummy d;
   x.some_usefull_function(d);
   // x.private == 100500
}
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
07.07.2013, 19:21     Protected Private Public #14
ForEveR, понял по аббревиатуре ODR Упустил {} после функции в классе.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2013, 20:44     Protected Private Public
Еще ссылки по теме:

Public и Private C++
Рекомендация: сначало public, потом protected/private C++
Public, Private, Protected (смысл применения) C++

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

Или воспользуйтесь поиском по форуму:
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
07.07.2013, 20:44  [ТС]     Protected Private Public #15
ForEveR, спасибо, примного благодарен.
Yandex
Объявления
07.07.2013, 20:44     Protected Private Public
Ответ Создать тему
Опции темы

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