150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
1

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

16.11.2011, 14:53. Показов 3046. Ответов 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");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2011, 14:53
Ответы с готовыми решениями:

QScriptEngine, как получить указатель на объект в коде функции С++, вызвашвий функцию в скрипте?
Есть QScriptEngine, добавляю туда функцию из кода С++ посредствам scriptEngine->newFunction();...

Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект
Други мои , кодеры. Не могу я ни как передать в функцию объект класса , или что еще лучше(для меня...

Указатель на объект или указатель на метод объекта
Здравствуйте! У меня много где случается, что надо классу заводить в заголовке указатель на объект...

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

5
В астрале
Эксперт С++
8042 / 4799 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.11.2011, 15:21 2
FireNovel, Нет. Статик функции могут оперировать онли со статик данными.
0
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
16.11.2011, 16:10  [ТС] 3
Цитата Сообщение от ForEveR Посмотреть сообщение
FireNovel, Нет. Статик функции могут оперировать онли со статик данными.
А если функция будет не статическая?
0
В астрале
Эксперт С++
8042 / 4799 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.11.2011, 16:19 4
FireNovel, Ну тогда очевидно. Если функция нестатическая и не является свободной функцией => вызывается с this автоматически. Следовательно доступ к полям произвести элементарно.
0
Эксперт С++
5824 / 3475 / 358
Регистрация: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2011, 18:06
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru