Здравствуйте, Артур, Вы писали:
А>Ну предположим ты добавляешь члены-данные, а где-то в глубине MFC код создаёт объект-наследник от CWnd и не знает, что ты добавил новый — член данных, и у CWnd изменился размер, и что тогда?
А>Кстати похожая функциональность есть если не ошибаюсь в JavaScript. Там можно во время выполнения добавлять в классы поля. Но это же интерпретируемый язык. В С++ такое сделать будет нелегко.
Можно просто сделать sizeof статическим мембером класса:
class A
{
public:
static size_t sizeofThis;
};
Испрользование:
A a; => A& a= *(A*)alloca(A::sizeofThis);
Здравствуйте, Артур, Вы писали:
А>Ну предположим ты добавляешь члены-данные, а где-то в глубине MFC код создаёт объект-наследник от CWnd и не знает, что ты добавил новый — член данных, и у CWnd изменился размер, и что тогда?
Действительно как-то нехорошо получается...
Ситуация еще усугубляется тем, что Microsoft могут в следующей версии MFC сами изменить размер CWnd. И весь код, который использует CWnd придется заново перекомпилировать под новую версию. А изменения, возможно, касались просто какого-нибудь приватного поля (которое должно было бы быть глубоко инкапсулировано)! Даже не интерфейса класса!
Впрочем, С++ достаточно гибок, и если работать не с конкретными классами, а с указателями на абстрактные интерфейсы, то можно избежать подобных проблем.
А>Кстати похожая функциональность есть если не ошибаюсь в JavaScript. Там можно во время выполнения добавлять в классы поля. Но это же интерпретируемый язык. В С++ такое сделать будет нелегко.
В С++ много чего можно сделать. Примером, тому может оригинальная идея Вадима, использовать alloca, для выделения памяти для объектов в стеке, размер которых может меняться; и "модерновая иерархия" Андрея WolfHound. Но я не помню, чтобы где-то я встречал что-то подобное, а если бы и встретил, то не сразу бы "догнал", что имеется в виду. Дело в том, что код становится более сложным и неочевидным и без огромных коментариев, зачем это нужно, никак не обойтись.
--
Дмитрий
"Я понимаю, что 2+2=4, но это мне кажется невыносимым." (с) Неврастеник
Здравствуйте, Дмитро, Вы писали:
L>>Реально это не плохо используется в Object-C++
Д>Что это? Дай ссылку или другой какой источник.
Это то на чем на Mac OS X программают — это надстройка над C (Object-C) и C++ (Object-C++).
http://developer.apple.com/techpubs/macosx/Cocoa/ObjectiveC/index.html
Здравствуйте, Дмитро, Вы писали:
Д>"модерновая иерархия" Андрея WolfHound.
Это у меня импровизации такие после того как Александреску начитался.
Д>Но я не помню, чтобы где-то я встречал что-то подобное, а если бы и встретил, то не сразу бы "догнал", что имеется в виду.
Прочитай Александреску будишь еще не такое понимать и придумывать.
... << RSDN@Home 1.0 beta 5 >>
Здравствуйте, IAZ, Вы писали:
IAZ>А то получается, что написал я графический редактор с использованием обычной библитеки классов (без извещения). А в один прекрасный момент программа стала посылать кому-то какие-то извещения!
"Значит это кому-нибудь нужно"
Здравствуйте, WolfHound, Вы писали:
WH>Прочитай Александреску будишь еще не такое понимать и придумывать.
Это?
http://oz.by/books/more104640.html
Взгляни на цену.
Здравствуйте, IAZ, Вы писали:
IAZ>Здравствуйте, Аноним, Вы писали:
IAZ>>>Хороший способ расширения библиотеки классов — это использование оберток.
А>>Хороший! Тем не менее, он не всегда срабатывает. Например, если нужно добавить не просто методы, а и члены-данные.
IAZ>Почему? Кто запрещает поместить вместе с методом и атрибуты?
IAZ>
IAZ>IAZ>template<class T>
IAZ>class X
IAZ>{
IAZ>public:
IAZ> X(T* _a) : a(_a) {}
IAZ> void h(); // метод
IAZ> int k; // атрибут
IAZ> T* operator->()
IAZ> {
IAZ> return a;
IAZ> }
IAZ>private:
IAZ> T* a;
IAZ>};
IAZ>
Никто не запрещает, только какой в этом смысл. Как узнать, что
такой атрибут изменился?