Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2010, 04:06   #1
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию интерфейсные классы(ДЛЛ)

в общем прошу просветить меня про правильное написание интерфейсов на С++.
думаю на основе класса наверно:
1)правильно ли обьявляю интерфейс:
Код:
class ITest
{
public:
    virtual void Test()=0;
};
?
2)соглашения о вызовах, какое лучше ставить?
stdcall?
3)совместимость с С, там через структуры, но, там помоему нет автопередачи себя(this) как в плюсах?
как верно обьявить интерфейс там?

заранее спасибо.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.12.2010, 12:47   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,091
По умолчанию

1. Хотите совместимость с Си, не используйте классы и интерфейсы.
2. Хотите таки экспортировать интерфейсы из DLL без COM?
3. Не забывайте, что интерфейсы в С++ по сути являются абстрактными классами, посему решайте как быть с деструкторами. Добавлять ли их виртуальные в интерфейс или не давать удалять объекты по указателю на интерфейс...
pu4koff вне форума Ответить с цитированием
Старый 13.12.2010, 12:58   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)насколько я знаю, в С их можно как то делать.
судя по заголовочникам DirectX(но у меня сейчас их нет)
но вот как?
2)ну а в чем мне выгода от COM?
там тоже ведь как средство связи используются интерфейсы.
3)скорее всего буду использовать счетчик ссылок.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.12.2010, 13:24   #4
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

я не писал на ком, но что ты хочешь сделать? запихнуть в dll реализацию интерфейса?

2pu4koff
Цитата:
1. Хотите совместимость с Си, не используйте классы и интерфейсы.
спорим, что можно использовать классы и интерфейсы, и сохранить совместимость с С?
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 13.12.2010 в 13:28.
pproger вне форума Ответить с цитированием
Старый 13.12.2010, 13:41   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну в общем то да, мне нужно чоб реализация(точнее код оной) были именно в ДЛЛ.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.12.2010, 14:02   #6
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Пепел Феникса

объявляешь интерфейс
Код:
class Interface {
public:
    virtual void foo() = 0;
};
он у тебя будет использоваться как в dll, так и в основой проге

пишем dll. реализуем твой интерфейс
Код:
class A : public Interface {
public:
    void foo()
    {
        // твоя реализация
    }
};
далее, в длл у тебя есть класс, надо как то создавать его объекты. делаем функцию-конструктор. если ты под виндой, то нужно эту функцию еще и экспортировать.

Код:
extern "C" Interface *create()
{
    return new A;
}
дллка закончена

пишем приложение. как я уже сказал, класс интерфейса у нас общий для приложения и дллок. опять же, если ты под виндой - динамически подгружаешь свою длл через loadLibrary

Код:
HANDLE h = LoadLibrary("a.dll");
получаешь указатель на свой конструктор
Код:
typedef Interface *(*Ctor)();
Ctor Create = (Ctor)GetProcAddress(h, "create");
ну и создаешь свой объект
Код:
Interface *i = Create();
i->foo();
так же, делаешь экспортируемый деструктор. + проверки на ошибки.
вроде нигде не лажанул.
на самом деле, все это тривиально. этой технике 100 лет в обед

да, и кстати. если это для тебя в новинку - тебе рано лезть в ком. поверь
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 13.12.2010 в 14:09.
pproger вне форума Ответить с цитированием
Старый 13.12.2010, 14:50   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

спасибо)

1)если у меня интерфейс будет расширен не виртуальными методами, то я не испорчу его?
2)а что насчет С?
3)соглашение о вызовах какое ставить?(ДЛЛ будет не только для С++)
4)можно ли использовать ссылки вместо указателей?

ЗЫ: мне в новинку лишь интерфейсы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.12.2010, 15:01   #8
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

1. с чего бы
2. а что насчет си?
3. никогда с этим не заморачивался. ну оставь stdcall, в другом языке его явно задашь, если он не по дефолту
4. ссылки? + си? + второй язык? как бы поделикатнее выразиться... не, не могу поделикатнее. полиморфные возможности класса реализуются за счет таблицы вирт функций, которую имеет класс, созданный в памяти динамически, имеющий хотя бы 1 вирт функцию. какие ссылки?

да и вряд ли можно заставить работать такую дллку не из с/с++. функцию-конструктор ты экспортнешь, и что дальше? придется писать аналогичный интерфейс для твоего другого языка, и как то их совмещать. я таким не занимался
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 13.12.2010 в 15:04.
pproger вне форума Ответить с цитированием
Старый 13.12.2010, 15:07   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1,3 спасибо)

2)как в С обьявить интерфейс?
через указатель на функцию в структуре?
4)я имел в виду здесь можно и использовать
Код:
Interface& i = Create();
i.foo();
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.12.2010, 15:20   #10
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Пепел Феникса

Код:
Interface& i = Create();
i.foo();
для чего? ну можно, если определишь свою функцию так
Код:
extern "C" Interface& create()
{
    Interface *ret = new A;
    return *ret;
}
но для чего? да и смысл тут в том, что create() может быть вызвана из языка си. в си же нет ссылок.

Цитата:
как в С обьявить интерфейс?
блин, интерфейс - просто набор функций, указателей на функции. в плюсах самое логичное принять за интерфейс абстрактный класс. как объявишь, так и будет. в сях я бы объявил структурой коллбеков
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длл на х32 CrystaLize Общие вопросы C/C++ 1 25.12.2009 17:58
Ошибка в длл Яр|/||< (^_^) Общие вопросы Delphi 2 16.10.2009 15:58
выгрузка длл user_jasser Win Api 6 10.03.2009 14:09
Фрэймы из ДЛЛ SunKnight Общие вопросы Delphi 4 06.01.2008 16:32