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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Wolkodav
609 / 462 / 33
Регистрация: 18.09.2012
Сообщений: 1,688
#1

Protected Private Public - C++

07.07.2013, 18:25. Просмотров 1086. Ответов 14
Метки нет (Все метки)

Возник вопрос, немного наверное бредовый и на практике наврятли применимый, но всё же интересно, а возможно поменять модификатор доступа в классе? Не допустим:
Вот есть у нас класс (у меня нету возможности поменять ручками в коде модификатор доступа):
C++
1
2
3
4
5
6
class A
{
private:
    int a;
    int Add(int b);
};
А мне вот приспичело воспользоваться методом 'Add'.
Есть идея обернуть класс в класс и сделать их друзьями, и получу доступ к private данным.
А вот есть ли что-то другое?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2013, 18:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Protected Private Public (C++):

private, protected, public - C++
class test { public: test(); int getPrivate(); int vpublic; protected: int vprotected; private: int vprivate;

Ключевые слова private, public, protected - C++
Смысл ключевых слов private, public, protected в списке базовых классов при декларации производного класса?

Public, Private, Protected (смысл применения) - C++
Прошу Вас пояснить реальный смысл ключевых слов, перечисленных в теме. С уважением

Наследование. Помогите с этими public, protected. private - C++
Вот код, в нем вылетает ошибка Unit2.cpp(16): E2251 Cannot find default constructor to initialize base class 'My' в файле unit2.cpp во...

Рекомендация: сначало public, потом protected/private - C++
На хабре есть статья "90 рекомендаций по стилю написания программ на C++". Интересует вот этот пункт: 44. Разделы класса public,...

Наследования класса как public, private и protected - C++
Ну допустим у нас есть класс который наследуется как public: class Cylinder : public Point { // ...здесь код } Класс...

14
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
07.07.2013, 18:29 #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" вообще не было бы
0
Wolkodav
609 / 462 / 33
Регистрация: 18.09.2012
Сообщений: 1,688
07.07.2013, 18:32  [ТС] #3
nexen, я же сказал, бредовый вопрос. А если ну не могу я менять исходный класс?
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
07.07.2013, 18:33 #4
Wolkodav, я же сказал - никак.
Хотя можно ещё сильнее извратиться и, если есть public-поля, то с помощью арифметики на указателях добраться до этих полей. Возможно это можно сделать даже при помощи методов и их размещения в памяти, но тут я уже не знаю
1
rangerx
1941 / 1550 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
07.07.2013, 18:35 #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
1
Wolkodav
609 / 462 / 33
Регистрация: 18.09.2012
Сообщений: 1,688
07.07.2013, 18:37  [ТС] #6
rangerx, зачтено)

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

Добавлено через 24 секунды
nexen, т.е. по адресу я могу обратиться к private данным?
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
07.07.2013, 18:43 #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;
}
0
Wolkodav
609 / 462 / 33
Регистрация: 18.09.2012
Сообщений: 1,688
07.07.2013, 18:45  [ТС] #8
nexen, а это интереснее, надо будет побаловаться.
0
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
07.07.2013, 18:49 #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;
}
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
07.07.2013, 18:58 #10
ForEveR, не могу понять, что тут такого? Разве тут не простое изменения поля шаблонным методом? Или я что-то упускаю?
0
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
07.07.2013, 19:07 #11
nexen, Специализация-то может находится где угодно. Это просто возможность доступа к private данным на самом деле извне, но технически из класса.
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
07.07.2013, 19:09 #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;
}
тоже сработает
0
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
07.07.2013, 19:18 #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
}
2
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
07.07.2013, 19:21 #14
ForEveR, понял по аббревиатуре ODR Упустил {} после функции в классе.
0
Wolkodav
609 / 462 / 33
Регистрация: 18.09.2012
Сообщений: 1,688
07.07.2013, 20:44  [ТС] #15
ForEveR, спасибо, примного благодарен.
0
07.07.2013, 20:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2013, 20:44
Привет! Вот еще темы с ответами:

Для чего нужны модификаторы protected, private, public - C++
подскажите, кто в курсе, зачем вообще нужны эти модификаторы доступа? ведь, все их можно обойти... сейчас курю Страуструпа &quot;Дизайн и...

Public и Private - C++
Доброго времени суток! Написал код и понял, что некоторые методы должны быть private, а не public. Если переношу их в private, то...

Предложите примеры деклараций классов с protected и private членами - C++
Только декларации. Как пишутся спецификаторы, я знаю. Просто надо сделать примеры деклараций классов со спецификаторами - и #, а я что то...

Зачем нужен тип private, если есть protected? - C++
зачем нужен тип private если есть protected??? одного не достаточно? ведь свойства те же. и даже лучше...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru