Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
FireNovel
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
#1

Получить указатель на объект который вызвал метод или Функцию в теле самой функции - C++

16.11.2011, 14:53. Просмотров 1275. Ответов 5
Метки нет (Все метки)

Доброго времени суток!

Можно ли не передавая явно указатель на объект(this) получить к нему доступ
из функции вызванной одним из методов этого класса.

т.е. Если раскоментировать строки (6,9, и 21) и убрать 12 то все будет работать

Собственно вопрос:
Можно ли обойтись без передачи указателя (this), ведь на сколько я понимаю при вызове функции, компилятору должно быть ясно, кто вызвал функцию (ну или метод класса), и неоднозначности возникнуть не должно.

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
class C2;
 
class C1 {
public:
 
    //static void sample(const C2 * obj)
    static void sample() {
        
        //obj->get_a();
        // какое-то шаманство, чтобы получить указатель ptr на объект кот. вызвал метод sample()
        // Причем тип вызывающего объекта известен (В нашем случае это С2)
        ptr->get_a();
    }
};
 
class C2 {
    int  a;
public:
    void sample2 () {
 
        //C1::sample(this);
        C1::sample();
    }
 
    int get_a() const { return a; }
};
 
 
void main()
{
    C1 c1;
    c1.sample();
 
    system("pause");
}

http://www.cyberforum.ru/cpp-beginners/thread1751561.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2011, 14:53
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Получить указатель на объект который вызвал метод или Функцию в теле самой функции (C++):

В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель
Друзья! Всем привет. Вот код: class otets { public: void f (void...

Чем отличаются указатель в теле функции и в аргументе
Здравствуйте. Не могу разобраться чем, в данном случае: bool LexAnalysis(const...

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как...

Основы: указатель на объект или объект, что выбрать?
Не до конца понимаю (или вообще не понимаю) когда лучше использовать указатель...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть...

5
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.11.2011, 15:21 #2
FireNovel, Нет. Статик функции могут оперировать онли со статик данными.
0
FireNovel
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
16.11.2011, 16:10  [ТС] #3
Цитата Сообщение от ForEveR Посмотреть сообщение
FireNovel, Нет. Статик функции могут оперировать онли со статик данными.
А если функция будет не статическая?
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.11.2011, 16:19 #4
FireNovel, Ну тогда очевидно. Если функция нестатическая и не является свободной функцией => вызывается с this автоматически. Следовательно доступ к полям произвести элементарно.
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
16.11.2011, 16:20 #5
Цитата Сообщение от FireNovel Посмотреть сообщение
компилятору должно быть ясно, кто вызвал функцию (ну или метод класса), и неоднозначности возникнуть не должно
нет, компилятору это ясно не будет

Цитата Сообщение от FireNovel Посмотреть сообщение
Можно ли обойтись без передачи указателя (this)
в принципе, этого можно добиться, если ты унаследуешь C1 от C2 (но тут либо C2::get_a должен быть статическим методом, либо C1::sample - нестатическим). Но не факт, что это подойдет для конкретной задачи
1
Сыроежка
Заблокирован
16.11.2011, 18:06 #6
Цитата Сообщение от FireNovel Посмотреть сообщение
Доброго времени суток!

Можно ли не передавая явно указатель на объект(this) получить к нему доступ
из функции вызванной одним из методов этого класса.

т.е. Если раскоментировать строки (6,9, и 21) и убрать 12 то все будет работать

Собственно вопрос:
Можно ли обойтись без передачи указателя (this), ведь на сколько я понимаю при вызове функции, компилятору должно быть ясно, кто вызвал функцию (ну или метод класса), и неоднозначности возникнуть не должно.

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
class C2;
 
class C1 {
public:
 
    //static void sample(const C2 * obj)
    static void sample() {
        
        //obj->get_a();
        // какое-то шаманство, чтобы получить указатель ptr на объект кот. вызвал метод sample()
        // Причем тип вызывающего объекта известен (В нашем случае это С2)
        ptr->get_a();
    }
};
 
class C2 {
    int  a;
public:
    void sample2 () {
 
        //C1::sample(this);
        C1::sample();
    }
 
    int get_a() const { return a; }
};
 
 
void main()
{
    C1 c1;
    c1.sample();
 
    system("pause");
}
Во-первых, почему вы решили, что компилятору известно, кто вызвал функцию? Как раз это компилятору неизвестно! Вы определили статическую функцию класса. Ее может вызвать любой код программы, имеющий доступ к этой открытой функции. То есть совсем не обязательно, что эту функцию будет вызывать функция-член класса. И что тогда делать компилятору? Как ему в вызываемую функцию передать информацию, что ее вызвала функция - не член класса?!

Компилятор не ломает голову над тем, кто вызывает функцию. Он лишь заносит в стек аргументы для функции и передает управлению по адресу точки входа функции. Только и всего.
1
16.11.2011, 18:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2011, 18:06
Привет! Вот еще темы с решениями:

Нужен простой пример передачи одной функции или метода в другую функцию или метод
Собственно сабж. Не знаю, как сделать. Как это выглядит синтаксически? Пробовал...

Скопировать объект, на который ссылается указатель на абстрактный класс
Доброго времени суток. У меня такое задание: написать программу символьного...

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

Написать функцию, которая принимает указатель на переменную и присваивает ей модуль самой себя.
Задача 1. Написать функцию, которая принимает указатель на переменную и...


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

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

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