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

Доступ к protected полям - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 5.00
dklabukov
0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 10
10.08.2011, 09:23     Доступ к protected полям #1
Добрый день!
Очень не часто пишу что-то на C++ и вот такой момент настал
Существует некий абстрактный класс содержащий указатель на функцию. Возможно ли из функции на которую будет ссылаться указатель получить доступ к protected полям класса?

Т.е.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A {
protected:
  int aa;
public:
  void (*ff)(int*);
};
 
class B : private A {
 
};
 
void FF(int*) {
  this->aa = 1; // Надо чтобы выполнилась эта строка, или тоже самое по сути
}
 
void main(void) {
  B b;
  b.ff = &FF;
  b.ff();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LosAngeles
Заблокирован
10.08.2011, 09:25     Доступ к protected полям #2
Цитата Сообщение от dklabukov Посмотреть сообщение
void FF(int*) {
this->aa = 1; // Надо чтобы выполнилась эта строка, или тоже самое по сути
}
здесь this быть не может
dklabukov
0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 10
10.08.2011, 09:36  [ТС]     Доступ к protected полям #3
Цитата Сообщение от LosAngeles Посмотреть сообщение
здесь this быть не может
Ок, что может?
LosAngeles
Заблокирован
10.08.2011, 09:47     Доступ к protected полям #4
даже если это возможно в чём я сильно сомневаюсь и проверять желания нет, то это грубейшее нарушение инкапсуляции. Так получается любая функция может помацать объект, это ж тупо
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
10.08.2011, 11:51     Доступ к protected полям #5
Цитата Сообщение от dklabukov Посмотреть сообщение
Добрый день!
Очень не часто пишу что-то на C++ и вот такой момент настал
Существует некий абстрактный класс содержащий указатель на функцию. Возможно ли из функции на которую будет ссылаться указатель получить доступ к protected полям класса?

Т.е.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A {
protected:
  int aa;
public:
  void (*ff)(int*);
};
 
class B : private A {
 
};
 
void FF(int*) {
  this->aa = 1; // Надо чтобы выполнилась эта строка, или тоже самое по сути
}
 
void main(void) {
  B b;
  b.ff = &FF;
  b.ff();
}
1. В классе у вас указатель на метод. А присваиваете вы ему указатель на функцию. Это РАЗНЫЕ указатели. Я тут уже постил материал про указатели на метод - поищите.
2. Внутри внешней функции указатель this недоступен. Он может использоваться только в методах.
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,670
10.08.2011, 13:21     Доступ к protected полям #6
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
1. В классе у вас указатель на метод. А присваиваете вы ему указатель на функцию. Это РАЗНЫЕ указатели.
Да нет, в классе объявлен открытый член-данное типа указатель на функцию. Но при закрытом наследовании в классе-неследнике он будет закрытым.
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
10.08.2011, 14:04     Доступ к protected полям #7
Описание приватного наследования
1)Общедоступные члены б.к становятся частными членами призв.класса
2)Защещенные члены б.к становятся частными членами п.к
3)Частные элементы б.к доступны только через интерфей б.к

А это значит что class B не может на прямую вызвать метод класса А. Надо
написать метод в классе В который обрабатывает открытую часть класса А
C++
1
2
3
4
5
6
7
8
9
void B::fun() {
//здесь видна открытая и защищенная часть класса А
} 
void A::fun(){
....
}
void B::fun2() {
A::fun()//так можно добраться до private части класса А
}
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,670
10.08.2011, 16:50     Доступ к protected полям #8
Ну а функцию можно нижеследующую написать, что еще раз подтверждает, что защищенные данные – это открытые данные.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
/////////////////////////////////////////////////////////////////////////////////////////
class A 
{
protected:
    int  i_;    
    //-----------------------------------------------------------------------------------
public:
    //-----------------------------------------------------------------------------------
    A() : i_()
    {}
    //-----------------------------------------------------------------------------------
    void  print()
    {
        std::cout << "i_ = " 
                  << i_
                  << std::endl;
    }
}; 
/////////////////////////////////////////////////////////////////////////////////////////
struct B : public A 
{   
    B(const A&  a, int  i) : A(a)
    {
        i_ = i;
    }
};
/////////////////////////////////////////////////////////////////////////////////////////
void  change_A_i(A&  a, int  i)
{   
    a = B(a, i);
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    A  a;
    a.print();    
    change_A_i(a, 15);
    a.print();
}
dklabukov
0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 10
10.08.2011, 16:57  [ТС]     Доступ к protected полям #9
Спасибо за ответы.

Вопрос был про возможность доступа к закрытым полям класса из функции которую вызвали бы используя указатель на функцию, являющийся открытым полем класса. Без передачи экземпляра класса, указателя на экземляр класса. Просто в тупую вызвать без параметров.

Ну что же, видимо так делать нельзя.
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,670
10.08.2011, 17:25     Доступ к protected полям #10
Цитата Сообщение от dklabukov Посмотреть сообщение
Вопрос был про возможность доступа к закрытым полям класса из функции которую вызвали бы используя указатель на функцию, являющийся открытым полем класса. Без передачи экземпляра класса, указателя на экземляр класса. Просто в тупую вызвать без параметров.
Ну, такая функция не является ни дружественной классу, ни членом этого класса, поэтому не ближе к его телу, чем любая другая, в том числе и написанная мной выше.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2011, 17:30     Доступ к protected полям
Еще ссылки по теме:

Полиморфизм и доступ к полям потомков C++
доступ к protected функции из потомка C++
C++ Шаблонный Список. не могу получить доступ к protected членам

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

Или воспользуйтесь поиском по форуму:
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
10.08.2011, 17:30     Доступ к protected полям #11
Мне кажется,я вам ответил.Вы хотите обратится из внешней функции к полям
класса,к которым можно обращаться по определенным правилам!
К полю
C++
1
аа
может обратиться только
C++
1
void (*ff)(int*);
а по скольку вы делаете это из производного класса,то к void (*ff)(int*) можно обратиться только
через интерфейс п.к
C++
1
2
3
void B::fun(){
A::ff=&extern_fun();
}
Тогда вопрос,как в extern_fun() вы хотите добраться до private части б.к?
Yandex
Объявления
10.08.2011, 17:30     Доступ к protected полям
Ответ Создать тему
Опции темы

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