__interface
Блок, относящийся только к системам Майкрософт
Интерфейс Microsoft C++ можно определить следующим образом:
Может наследовать от произвольного (включая 0) числа базовых интерфейсов.
Не может наследовать от базового класса.
Может содержать только открытые, чисто виртуальные методы.
Не может содержать конструкторы, деструкторы или операторы.
Не может содержать статические методы.
Не может содержать члены данных; свойства допускаются.
Синтаксис
modifier __interface interface-name {interface-definition};
Замечания
Класс или структуру C++ можно реализовать с помощью этих правил, но __interface
применяет их.
Например, ниже приведен пример определения интерфейса:
__interface IMyInterface {
HRESULT CommitX();
HRESULT get_X(BSTR* pbstrName);
};
Сведения об управляемых интерфейсах см . в разделе "Класс интерфейса".
Обратите внимание — нет необходимости явно указывать, что функции CommitX
и get_X
являются чистой виртуальными. Эквивалентное объявление для первой функции могло бы быть следующим:
virtual HRESULT CommitX() = 0;
__interface
подразумевает модификатор novtable__declspec
.
Пример
В следующем примере показано, как использовать свойства, объявленные в интерфейсе.
// deriv_interface.cpp
#define _ATL_ATTRIBUTES 1
#include <atlbase.h>
#include <atlcom.h>
#include <string.h>
#include <comdef.h>
#include <stdio.h>
[module(name="test")];
[ object, uuid("00000000-0000-0000-0000-000000000001"), library_block ]
__interface IFace {
[ id(0) ] int int_data;
[ id(5) ] BSTR bstr_data;
};
[ coclass, uuid("00000000-0000-0000-0000-000000000002") ]
class MyClass : public IFace {
private:
int m_i;
BSTR m_bstr;
public:
MyClass()
{
m_i = 0;
m_bstr = 0;
}
~MyClass()
{
if (m_bstr)
::SysFreeString(m_bstr);
}
int get_int_data()
{
return m_i;
}
void put_int_data(int _i)
{
m_i = _i;
}
BSTR get_bstr_data()
{
BSTR bstr = ::SysAllocString(m_bstr);
return bstr;
}
void put_bstr_data(BSTR bstr)
{
if (m_bstr)
::SysFreeString(m_bstr);
m_bstr = ::SysAllocString(bstr);
}
};
int main()
{
_bstr_t bstr("Testing");
CoInitialize(NULL);
CComObject<MyClass>* p;
CComObject<MyClass>::CreateInstance(&p);
p->int_data = 100;
printf_s("p->int_data = %d\n", p->int_data);
p->bstr_data = bstr;
printf_s("bstr_data = %S\n", p->bstr_data);
}
p->int_data = 100
bstr_data = Testing
Завершение блока, относящегося только к системам Майкрософт
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по