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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2015, 19:12   #1
lepskaya
Новичок
Джуниор
 
Регистрация: 16.08.2015
Сообщений: 2
По умолчанию Вызов функции из вложенного класса

Здравствуйте. Не могу понять, как вызвать функцию из вложенного класса.
Вот такой код:
Код:
class MyOwnClass
{
public:
	void InvMethod()
	{
		MessageBox(0, "in InvMethod", "", 0);
	}
private:
		class TShellEventSink : public IDispatch
		{
		protected:
			long m_cRef;
		public:
			TShellEventSink()  { m_cRef = 0; }
			~TShellEventSink() { }

			HRESULT __stdcall QueryInterface(REFIID riid, void** ppvObject)
			{
				*ppvObject = NULL;

				if (IsEqualGUID(riid, IID_IUnknown))
					*ppvObject = reinterpret_cast<void**>(this);

				if (IsEqualGUID(riid, IID_IDispatch))
					*ppvObject = reinterpret_cast<void**>(this);

				if (*ppvObject)
				{
					((IUnknown*)*ppvObject)->AddRef();
					return S_OK;
				}
				else return E_NOINTERFACE;
			}

			DWORD __stdcall AddRef()
			{
				return InterlockedIncrement(&m_cRef);
			}

			DWORD __stdcall Release()
			{
				if (InterlockedDecrement(&m_cRef) == 0)
				{
					delete this;
					return 0;
				}
				return m_cRef;
			}

			STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pctinfo)
			{
				return E_NOTIMPL;
			}

			STDMETHOD(GetTypeInfo)(unsigned int iTInfo, LCID  lcid, ITypeInfo FAR* FAR*  ppTInfo)
			{
				return E_NOTIMPL;
			}

			STDMETHOD(GetIDsOfNames)(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames,
                          LCID lcid, DISPID FAR* rgDispId)
			{
				return S_OK;
			}

			STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
                          DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO * pExcepInfo, UINT * puArgErr)
			{
				switch (dispIdMember) {
				case DISPID_WINDOWREGISTERED:
				{
					InvMethod();
					break;
				}
				case DISPID_WINDOWREVOKED:
					break;
				}
				return S_OK;
			}
		};
};
Мне нужно из функции Invoke, когда событие DISPID_WINDOWREGISTERED, вызвать функцию InvMethod. Как это сделать?
Код выше не работает.
Спасибо.

Последний раз редактировалось Stilet; 16.08.2015 в 20:13.
lepskaya вне форума Ответить с цитированием
Старый 16.08.2015, 20:14   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Код выше не работает.
А ты уверен что DISPID_WINDOWREGISTERED приходит в Invoke?
Поставь точку прерывания и посмотри.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.08.2015, 20:41   #3
lepskaya
Новичок
Джуниор
 
Регистрация: 16.08.2015
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А ты уверен что DISPID_WINDOWREGISTERED приходит в Invoke?
Поставь точку прерывания и посмотри.
Да. Тут проблема даже в другом, что такой код понятное дело не компилируется.
Цитата:
Error 1 error C2352: 'MyOwnClass::InvMethod' : illegal call of non-static member function c:\consoleapplication1.cpp 254 1 ConsoleApplication1
lepskaya вне форума Ответить с цитированием
Старый 16.08.2015, 21:11   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну сделай его статическим )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.08.2015, 21:42   #5
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

lepskaya

Здравствуйте. Не могу понять, как вызвать функцию из вложенного класса.

вложенный класс в рамках c++ ничем не отличается от обычного класса.
ему не передается никакое тайное знание относительно "внешнего" класса

либо передавай указатель на внешний класс, либо, через хак:

Код:
    #include <iostream>
    #include <stddef.h>
     
    class Foo
    {
    public:
    	void SayHello() { std::cout << "Hello" << std::endl; }

    	class Bar
    	{
    	public:
    	    void Invoke()
		    {
          		((Foo*)((char*)this - offsetof(Foo, bar)))->SayHello();
    		}
    	} bar;
    };
     

    int main()
    {
       Foo foo;
       foo.bar.Invoke();
    }
Rififi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов функции из класса mc13 Общие вопросы по Java, Java SE, Kotlin 11 08.02.2015 20:52
Вызов функции из одного класса кнопкой из другого класса lexflax Qt и кроссплатформенное программирование С/С++ 1 12.12.2014 21:48
Вызов метода из вложенного класса AlexCODER23 C# (си шарп) 3 02.02.2012 11:39
Вызов функции класса по адресу VintProg Общие вопросы Delphi 9 03.11.2009 05:17
Автоматический вызов функции класса Flaton Общие вопросы C/C++ 4 19.10.2007 17:56