Re[7]: Ну это просто
От: lboss Россия  
Дата: 27.03.03 10:33
Оценка: 2 (1)
Здравствуйте, Артур, Вы писали:

А>Ну предположим ты добавляешь члены-данные, а где-то в глубине MFC код создаёт объект-наследник от CWnd и не знает, что ты добавил новый — член данных, и у CWnd изменился размер, и что тогда?


А>Кстати похожая функциональность есть если не ошибаюсь в JavaScript. Там можно во время выполнения добавлять в классы поля. Но это же интерпретируемый язык. В С++ такое сделать будет нелегко.


Можно просто сделать sizeof статическим мембером класса:

class A
{
public:
static size_t sizeofThis;
};


Испрользование:
A a; =>  A& a= *(A*)alloca(A::sizeofThis);
С уважением Вадим.
Re[7]: Расширение С++
От: Дмитро  
Дата: 28.03.03 01:54
Оценка: 3 (1)
Здравствуйте, Артур, Вы писали:


А>Ну предположим ты добавляешь члены-данные, а где-то в глубине MFC код создаёт объект-наследник от CWnd и не знает, что ты добавил новый — член данных, и у CWnd изменился размер, и что тогда?


Действительно как-то нехорошо получается...

Ситуация еще усугубляется тем, что Microsoft могут в следующей версии MFC сами изменить размер CWnd. И весь код, который использует CWnd придется заново перекомпилировать под новую версию. А изменения, возможно, касались просто какого-нибудь приватного поля (которое должно было бы быть глубоко инкапсулировано)! Даже не интерфейса класса!

Впрочем, С++ достаточно гибок, и если работать не с конкретными классами, а с указателями на абстрактные интерфейсы, то можно избежать подобных проблем.

А>Кстати похожая функциональность есть если не ошибаюсь в JavaScript. Там можно во время выполнения добавлять в классы поля. Но это же интерпретируемый язык. В С++ такое сделать будет нелегко.


В С++ много чего можно сделать. Примером, тому может оригинальная идея Вадима, использовать alloca, для выделения памяти для объектов в стеке, размер которых может меняться; и "модерновая иерархия" Андрея WolfHound. Но я не помню, чтобы где-то я встречал что-то подобное, а если бы и встретил, то не сразу бы "догнал", что имеется в виду. Дело в том, что код становится более сложным и неочевидным и без огромных коментариев, зачем это нужно, никак не обойтись.

--
Дмитрий

"Я понимаю, что 2+2=4, но это мне кажется невыносимым." (с) Неврастеник
--
Дмитрий
Re[8]: Ну это зря...
От: lboss Россия  
Дата: 28.03.03 08:44
Оценка:
Здравствуйте, Дмитро, Вы писали:


Д> ... Но я не помню, чтобы где-то я встречал что-то подобное.


Реально это не плохо используется в Object-C++, правда там можно рассширять классы только новыми методами (там они называются event'ами) — это приводит к довольно таки приятному деленюю классов на части относящиееся к разным областям применениям — например, рассширение строк для работы с именами файлов (не писать GetFileExt(string) а сделать спец рассширение к классу). Реально я считаю что данное рассширение С++ довольно приятноё — так как позволяет более правильно проектировать объектную модель и позволяет отделять непосредственно объект от утилит работы с ним...
С уважением Вадим.
Re[9]: Ну это зря...
От: Дмитро  
Дата: 28.03.03 10:15
Оценка:
Здравствуйте, lboss, Вы писали:

L>Реально это не плохо используется в Object-C++


Что это? Дай ссылку или другой какой источник.

--
Дмитрий
--
Дмитрий
Re[10]: Ну это зря...
От: lboss Россия  
Дата: 28.03.03 10:26
Оценка: 2 (1)
Здравствуйте, Дмитро, Вы писали:

L>>Реально это не плохо используется в Object-C++

Д>Что это? Дай ссылку или другой какой источник.

Это то на чем на Mac OS X программают — это надстройка над C (Object-C) и C++ (Object-C++). http://developer.apple.com/techpubs/macosx/Cocoa/ObjectiveC/index.html
С уважением Вадим.
Re[8]: Расширение С++
От: WolfHound  
Дата: 28.03.03 15:11
Оценка:
Здравствуйте, Дмитро, Вы писали:

Д>"модерновая иерархия" Андрея WolfHound.

Это у меня импровизации такие после того как Александреску начитался.
Д>Но я не помню, чтобы где-то я встречал что-то подобное, а если бы и встретил, то не сразу бы "догнал", что имеется в виду.
Прочитай Александреску будишь еще не такое понимать и придумывать.
... << RSDN@Home 1.0 beta 5 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[7]: Расширение С++
От: limax Эстония http://mem.ee
Дата: 09.05.03 14:40
Оценка:
Здравствуйте, IAZ, Вы писали:
IAZ>А то получается, что написал я графический редактор с использованием обычной библитеки классов (без извещения). А в один прекрасный момент программа стала посылать кому-то какие-то извещения!

"Значит это кому-нибудь нужно"
Have fun: Win+M, Ctrl+A, Enter
Re[9]: Расширение С++
От: limax Эстония http://mem.ee
Дата: 09.05.03 14:54
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Прочитай Александреску будишь еще не такое понимать и придумывать.

Это?
http://oz.by/books/more104640.html
Взгляни на цену.
Have fun: Win+M, Ctrl+A, Enter
Re[7]: Расширение С++
От: MaximE Великобритания  
Дата: 09.05.03 19:21
Оценка:
Здравствуйте, 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>


Никто не запрещает, только какой в этом смысл. Как узнать, что такой атрибут изменился?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.