не возможно создать экземпляр абстрактного класса

хочу проверить отправку сообщений в область уведомлений. и понял что для этого надо создать класс, в котором надо реализовать интерфейсы. но я не понимаю какие нужно реализовать. компилятор пишет только что не возможно создать экземпляр абстрактного класса. в 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 шт):

Автор решения: MSDN.WhiteKnight

У вас реализованы не все чистые виртуальные функции; и те что есть, реализованы неправильно (нет virtual) и под блоком #if 0, поэтому они вообще не учитываются. Чтобы создать заготовку для всех нужных реализаций, в Visual Studio, например, можно использовать рефакторинг: правой кнопкой по интерфейсу -> Быстрые действия и рефакторинг -> Реализовать чистые виртуальные функции для ....

refactoring

Либо просто скопировать определение интерфейса и заменить все "=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;
    }
};

Возможно, вам все это не нужно, посмотрите более простые примеры для работы с уведомлениями.

→ Ссылка