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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 5.00
dklabukov
0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 10
#1

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

10.08.2011, 09:23. Просмотров 2220. Ответов 10
Метки нет (Все метки)

Добрый день!
Очень не часто пишу что-то на 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();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2011, 09:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Доступ к protected полям (C++):

Почему не могу получить доступ к protected полям из дочернего класса? - C++
Пытаюсь получить доступ к ships из дочернего класса Referee, но не получается. В чем ошибка? class Player { protected: ...

c++ доступ к protected свойствам - C++
давайте рассмотрим доступ к protected свойствам и методам класса известно что напрямую их вызвать можно только внутри класса...

Доступ внука к Protected - C++
Здравствуйте, сегодня встал перед такой проблемой. Дело в том, что создал класс, наследующий public доступом по цепочке (внук). Но если...

доступ к protected функции из потомка - C++
Есть базовый класс parent. У него есть метод func. Нужно дать потомкам parent, доступ к func у объектов типа parent. А всем остальным...

Шаблонный Список. не могу получить доступ к protected членам - C++
Здравствуйте! Я пытаюсь сделать шаблонный список, все вроде бы пашет. но есть 2 проблемы. 1. Все работает но только если члены...

Доступ к полям класса - C++
Имеет список list с объектами класса zapis list<zapis> list как мне получить значение поля класса, например поле Number

10
LosAngeles
Заблокирован
10.08.2011, 09:25 #2
Цитата Сообщение от dklabukov Посмотреть сообщение
void FF(int*) {
this->aa = 1; // Надо чтобы выполнилась эта строка, или тоже самое по сути
}
здесь this быть не может
0
dklabukov
0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 10
10.08.2011, 09:36  [ТС] #3
Цитата Сообщение от LosAngeles Посмотреть сообщение
здесь this быть не может
Ок, что может?
0
LosAngeles
Заблокирован
10.08.2011, 09:47 #4
даже если это возможно в чём я сильно сомневаюсь и проверять желания нет, то это грубейшее нарушение инкапсуляции. Так получается любая функция может помацать объект, это ж тупо
0
ValeryLaptev
Эксперт С++
1046 / 825 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.08.2011, 11:51 #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 недоступен. Он может использоваться только в методах.
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
10.08.2011, 13:21 #6
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
1. В классе у вас указатель на метод. А присваиваете вы ему указатель на функцию. Это РАЗНЫЕ указатели.
Да нет, в классе объявлен открытый член-данное типа указатель на функцию. Но при закрытом наследовании в классе-неследнике он будет закрытым.
1
lavan
53 / 53 / 1
Регистрация: 21.03.2009
Сообщений: 371
10.08.2011, 14:04 #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 части класса А
}
1
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
10.08.2011, 16:50 #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();
}
0
dklabukov
0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 10
10.08.2011, 16:57  [ТС] #9
Спасибо за ответы.

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

Ну что же, видимо так делать нельзя.
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
10.08.2011, 17:25 #10
Цитата Сообщение от dklabukov Посмотреть сообщение
Вопрос был про возможность доступа к закрытым полям класса из функции которую вызвали бы используя указатель на функцию, являющийся открытым полем класса. Без передачи экземпляра класса, указателя на экземляр класса. Просто в тупую вызвать без параметров.
Ну, такая функция не является ни дружественной классу, ни членом этого класса, поэтому не ближе к его телу, чем любая другая, в том числе и написанная мной выше.
0
lavan
53 / 53 / 1
Регистрация: 21.03.2009
Сообщений: 371
10.08.2011, 17:30 #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 части б.к?
0
10.08.2011, 17:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2011, 17:30
Привет! Вот еще темы с ответами:

Доступ к полям структуры по номерам - C++
Как можно присвоить полям структуры номера и организовать к ним доступ по этому номеру? Видел где-то идею сделать внутри структуры функцию,...

Получить доступ к полям структуры - C++
здравствуйте,если свести проблему к локальному контексту, то есть код примерно такой: struct zeus { template&lt;typename...

Полиморфизм и доступ к полям потомков - C++
Задача: накидать в окне прямоугольники и круги, а потом упаковать их максимально плотно. Делаем в Qt. Структура классов такая: есть базовый...

Класс - друг. Доступ к полям и методам - C++
Есть два класса: MainWindow и LBM_computation, в одном из них происходят вычисления. Класс MainWindow - для визуализации. Надо сделать так,...


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

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

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