не возможно создать экземпляр абстрактного класса
хочу проверить отправку сообщений в область уведомлений. и понял что для этого надо создать класс, в котором надо реализовать интерфейсы. но я не понимаю какие нужно реализовать. компилятор пишет только что не возможно создать экземпляр абстрактного класса. в android studio на java можно наследуюсь получить сразу все функции, которые нужно переопределить. но здесь я не разбираюсь совсем. я написал класс.
#include "notify.h"
void notify::set_info() { SetBalloonInfo(L"test", L"hello", NIF_INFO); }
void notify::show() { Show(NULL, 3000, NULL); }
#if 0
HRESULT notify::OnBalloonUserClick(POINT* pt) { return 0; }
HRESULT notify::OnContextMenu(POINT* pt) { return 0; }
HRESULT notify::OnLeftClick(POINT* pt) { return 0; }
#endif
notify.h
#pragma once
#include <ShObjIdl.h>
class notify : public IUserNotification2, public IUserNotificationCallback {
public:
void set_info();
void show();
#if 0
HRESULT OnBalloonUserClick(POINT *pt);
HRESULT OnContextMenu(POINT *pt);
HRESULT OnLeftClick(POINT *pt);
#endif
};
Ответы (1 шт):
У вас реализованы не все чистые виртуальные функции; и те что есть, реализованы неправильно (нет virtual) и под блоком #if 0, поэтому они вообще не учитываются. Чтобы создать заготовку для всех нужных реализаций, в Visual Studio, например, можно использовать рефакторинг: правой кнопкой по интерфейсу -> Быстрые действия и рефакторинг -> Реализовать чистые виртуальные функции для ....
Либо просто скопировать определение интерфейса и заменить все "=0" на реализацию. Вот минимально компилируемая заготовка для вашего класса:
class notify : public IUserNotification2, public IUserNotificationCallback {
public:
// Унаследовано через IUserNotification2
virtual HRESULT __stdcall QueryInterface(REFIID riid, void ** ppvObject) override
{
return 0;
}
virtual ULONG __stdcall AddRef(void) override
{
return 0;
}
virtual ULONG __stdcall Release(void) override
{
return 0;
}
virtual HRESULT __stdcall SetBalloonInfo(LPCWSTR pszTitle, LPCWSTR pszText, DWORD dwInfoFlags) override
{
return 0;
}
virtual HRESULT __stdcall SetBalloonRetry(DWORD dwShowTime, DWORD dwInterval, UINT cRetryCount) override
{
return 0;
}
virtual HRESULT __stdcall SetIconInfo(HICON hIcon, LPCWSTR pszToolTip) override
{
return 0;
}
virtual HRESULT __stdcall Show(IQueryContinue * pqc, DWORD dwContinuePollInterval, IUserNotificationCallback * pSink) override
{
return 0;
}
virtual HRESULT PlaySoundW(LPCWSTR pszSoundName)
{
return E_NOTIMPL;
}
// Унаследовано через IUserNotificationCallback
virtual HRESULT __stdcall OnBalloonUserClick(POINT * pt) override
{
return 0;
}
virtual HRESULT __stdcall OnLeftClick(POINT * pt) override
{
return 0;
}
virtual HRESULT __stdcall OnContextMenu(POINT * pt) override
{
return 0;
}
};
Возможно, вам все это не нужно, посмотрите более простые примеры для работы с уведомлениями.
