Вчера пришлось переводить некий Делфи проект на С++Builder. Все шло хорошо пока не
наткнулся на новою фичу Дельфи Class method definition Здесь нашел маленькое описание
по этому поводу. Особенно огорчился прочитав эту строку
I'd like to discuss one of the unique language features of Delphi's Object Pascal, one that even C++ doesn't have
Неужели в C++ нельзя реализовать такую фичу? или хотябы как-то имитировать?
Если есть какие-то идеи пишите будет интересно ухнать мнение народа.
Здравствуйте Holms, Вы писали:
H>Вчера пришлось переводить некий Делфи проект на С++Builder. Все шло хорошо пока не H>наткнулся на новою фичу Дельфи Class method definition H>Здесь нашел маленькое описание H>по этому поводу. Особенно огорчился прочитав эту строку
H>
H>I'd like to discuss one of the unique language features of Delphi's Object Pascal, one that even C++ doesn't have
H>
H>Неужели в C++ нельзя реализовать такую фичу? или хотябы как-то имитировать? H>Если есть какие-то идеи пишите будет интересно ухнать мнение народа.
Мне кажется, что ничего страшного. Цитата оттуда же: What I just just described is nothing exciting and in fact C++ offers it as well with static methods.
Здравствуйте Holms, Вы писали:
H>Вчера пришлось переводить некий Делфи проект на С++Builder. Все шло хорошо пока не H>наткнулся на новою фичу Дельфи [b]Class method definition
TObject=сlass
class function My() :Integer;
end;
аналогична
Здравствуйте Holms, Вы писали:
H>Вчера пришлось переводить некий Делфи проект на С++Builder. Все шло хорошо пока не H>наткнулся на новою фичу Дельфи Class method definition H>Здесь нашел маленькое описание H>по этому поводу. Особенно огорчился прочитав эту строку
H>
H>I'd like to discuss one of the unique language features of Delphi's Object Pascal, one that even C++ doesn't have
H>
H>Неужели в C++ нельзя реализовать такую фичу? или хотябы как-то имитировать? H>Если есть какие-то идеи пишите будет интересно ухнать мнение народа. Class method definition — это один в один статический метод класса.
Обьявляется вот так:
//в .h файлеclass TheClass {
static int m_nNumberOfInstances;
public:
static int getNumberOfInstances();
};
//в .cpp файлеint TheClass::m_nNumberOfInstances = 0;
/* static - это просто комментарий чтобы знать что метод статический */int TheClass::getNumberOfInstances()
{
return m_nNumberOfInstances;
}
//использованиеint xxx = TheClass::getNumberOfInstances();
Что же касается виртуальных конструкторов, то данная проблема довольно легко решается при помощи функций — "фабрик классов". Про них можешь почитать в книге Мейерса, "Наиболее эффективный C++"
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.
H>Неужели в C++ нельзя реализовать такую фичу? :???: или хотябы как-то имитировать? H>Если есть какие-то идеи пишите будет интересно ухнать мнение народа.
Вся проблема в второй части. В терминах Builder эта проблема называется:Созданием экземпляра класса по его метаклассу. Вообще то такие задачи решаются созданием "Фабрики класса", Но при этом есть одно ограничение — фабрика классов может создать экземпляр только ей известного класса.В Дельфи — это ограничение снято, поскольку "Фабрика классов" встроена непосредственно в язык
Вот этой строкой я получаю информацию о классе. Причем никакой фабрики классов не создается
"class of" — это конструкция языка.
THintWindowClass = class of THintWindow;
var
HintWindowClass = THintWindowClass;
а этой получаю экземпляр этого класса по информации класса
FHintWindow := HintWindowClass.Create(Self);
Как видно при этом, никаких дополнительных конструкций, кроме средств языка не используется
В C++Builder это должно было бы выглядеть примено так
TMetaClass* MetaClass = __classid(THintWindow);
А вот дальше должно было бы быть примерно так
//выделяем место
char* cAllocMem = new char[TObject::InstanceSize(MetaClass)];
//инициализируем
FHintWindow = TObject::InitInstance(MetaClass, cAllocMem);
Но это к сожалению не работает.Вернее работает, но на простейших классах. На мой вопрос можно ли создать экземпляр класса по метаклассу или по имени класса один из программистов из команды TeamB ответил, что нет и предложил создать соответствующую функцию средствами Delphi и вызывать ее в коде Builder
Здравствуйте Holms, Вы писали:
H>Все шло хорошо пока не H>наткнулся на новою фичу Дельфи Class method definition
Я был приятно удивлён наличием модификатора типа методов "of object", вот это да !
А "Class method definition" — это, извините, всего лишь статический метод :(
Может лучше народ поскажет как делать аналог такого кода на C++:
TCallback = procedure ( pData : Pointer ) of object;
TNotifyer = class
FCB : TCallback;
public
property Callback read FCB write FCB;
end;
Достаточно элегантно выглядит, неправда ли ? И не надо передавать никаких указателей на
объект — это обеспечивает сам язык.