![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| flagist0 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 29.10.2007 Репутация: нет Всего: нет |
Люди, пожалуйста, подскажите где копать насчет сабжа.
Не могу понять сам процесс вызова некого метода на С++ из С. Ведь методы принимают скрытый this! |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
а ты передавай в открытую и вообще, можно поподробнее вопрос осветить? |
|||
|
||||
| flagist0 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 29.10.2007 Репутация: нет Всего: нет |
Вопрос общий, но поднят реальной ситуацией.
Операционка принимает (для реализации функций файловой системы) адрес функции на С, за которой должна быть здоровая инфраструктура. Этот код потом надо будет перенести в другой проект. Так что решено сделать функцию на С, которая собсно вызывает методы плюсового объекта. PS: простите если невнятно, я в С++ - 0. |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
то есть из dll, будут торчать функции плюсового класса?
|
|||
|
||||
| flagist0 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 29.10.2007 Репутация: нет Всего: нет |
Что-то в этом роде. Только в операционке нет разделения kernel/user, нет отдельных процессов, и динамической линковки собсно тоже нет.
Т.е., идея в том, чтобы сохранить this'ы объектов (разные разделы в моем случае), а потом вызывать методы, напрямую передавая им нужный this? Есть подозрение, что компилятору это не понравится :( Это сообщение отредактировал(а) flagist0 - 11.6.2008, 17:51 |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
если ты будешь вызывать функции из dll, то компилер не при делах
если же у тебя в 1 проекте и С и C++, причем сишный код вызывает плюсовой... это разве возможно вообще? |
|||
|
||||
| flagist0 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 29.10.2007 Репутация: нет Всего: нет |
Наверное возможно. extern "C++" { #include "lala.h" } Да и вызов плюсового метода (ИМХО) отличается от обычной сишной функции указателем this в списке параметров, который компилятор подставляет автоматически. А со стороны С, где компилятор понятия не имеет об OO-штучках, мы сами передадим заранее сохраненный this. |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 8 Всего: 158 |
я так и не понял, кто кого вызывает, и кто какие параметры передает.
вообще в таких случаях рулит static метод класса. |
|||
|
||||
| flagist0 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 29.10.2007 Репутация: нет Всего: нет |
Полная ситуация такова:
Есть класс одноуровневой файловой системы MyFS, экземпляров которой может быть несколько. При инициализации экземпляра, вызывающая сторона передает содержимое суперблока этой файловой системы, по которой объект строит список файлов. Но ОС ставит требование - для реализации всех функций (mount, unmount, open etc) ей надо передать адреса функций с определенными параметрами. Так вот, задача состоит в том, чтобы подсунуть ОС сишные функции, которые будут работать с С++овым классом MyFS. Пока формулировал, начал понимать |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
А какое, в общем случае, компилятору дело, что за указатель, this, или ещё на что? Ты просто сохраняешь этот this, и делаешь потом из С-шного кода
Я так потоки с экземплярами классов связываю. |
|||
|
||||
| flagist0 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 29.10.2007 Репутация: нет Всего: нет |
Спасибо! Как-то не подумал, на что он собственно указывает :( Это ж структура, с адресами функций!!
Второй раз спасибо! Как-то была жуткая проблема - как при инициализации треда передать ему адрес метода. |
||||
|
|||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Ну, если уж мне совсем к себе придраться, то делать нужно так:
Как-то так... Это сообщение отредактировал(а) EnergoHokum - 11.6.2008, 19:21 |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
это точно будет работать?
что-то неуверен, что указатели на функции-члены в плюсах хранятся как поля (хоть и статические) этого класса... |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Где-то на просторах интернетов мне недавно попадалась статья, где (на примерах распотрошённого кода) показывалось, что дела обстоят именно так. Ну, в качестве эксперимента, попробуй из экземпляра класса создать поток, отдав ему this, и поменять на ходу из потока какую-нить переменную этого экземпляра. |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Что-то меня эти выводы смущают. Товарищи проверили это на всех доступных компиляторах, чтобы это утверждать? Гарантируют, что в будущем это не изменится? Нельзя полагаться на нестандартные вещи, если только речь не идёт об очень узкой и конкретной области. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |