Проблема доступа к членам класса из вложенного
От: adr Украина  
Дата: 09.12.04 16:43
Оценка:
Необходимо унифицированное решение для вызова метода Trace для экземпляра произвольного класса.
Для решения такого класса задач разработан патерн "Анонимный адаптер". Эта концепция отлично работает в Java, Технически анонимный адаптер это вложенный класс, для методов которого все члены внешнего оказываются в глобальной области видимости. Попробовал реализовать конструкцию на С++ и получил ошибку

c:\mine\ServerLib\traceSound.cpp(67): error C2352: 'server_lib::TTraceSound::Play' : illegal call of non-static member function

Компилятор Microsoft VC7



Как видно из объявления, метод Play() класса TTraceSound объявлен в области видимости TAnonymousAdapter.

namespace server_lib
{
    class TTraceSound
    {
    private:
    //public:
        std::string m_szFileName;
        unsigned int m_DeviceID;
        bool m_fDeviceOpened;
        const int m_Freq;
        const int m_Time;
    private:
        void CloseDevice();

    public:
        bool Link(const char* szFileName);
        void Unlink();
        unsigned long Play();
        void Trace(eTraceMessageType, const char*, ...);

    public:
        class TAnonymousAdapter
        {
        public:
            void Trace(eTraceMessageType, const char*, ...);
        };

    public:
        TTraceSound();
        virtual ~TTraceSound();
    };

};    // END OF NAMESPACE



Так почему же его нельзы вызвать из метода Trace класса TAnonymousAdapter
using namespace server_lib;

//----------------------------------------------------------
void TTraceSound::TAnonymousAdapter::Trace(eTraceMessageType, const char*, ...)
{
    TTraceSound::Play(); // Здесь error C2352
}
//----------------------------------------------------------



И какой же тогда смысл в объявлении классов как вложенных впринципе, если нет доступа к мемберам внешнего?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.