Необходимо унифицированное решение для вызова метода 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
}
//----------------------------------------------------------
И какой же тогда смысл в объявлении классов как вложенных впринципе, если нет доступа к мемберам внешнего?