Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Денис Майдыковский, Вы писали:
ДМ>>Статья:
ДМ>>Авторы: ДМ>> Денис Майдыковский
ДМ>>Аннотация: ДМ>>В этой статье автор рассматривает различные способы реализации свойств в стиле Visual Basic на C++. Некоторые способы специфичны для Visual C++, тогда как другие годятся для применения в любой программе, написанной на языке C++.
А>Не пойму смысл данной конструкции. Объясните что это А>typedef proptype (propowner::*getter)();
Ей богу, не для этого тему поднимал. Простите, пожалуйста..
VAX/VMS rulez!
Re[2]: А реально кто ни будь использует ТАКИЕ свойства?
От:
Аноним
Дата:
10.07.04 01:32
Оценка:
Здравствуйте, SergeyBi, Вы писали:
SB>Использование шаблонов приводит к увеличению размеров исполняемого кода, поскольку компилятор будет генерировать отдельный класс для каждой пары "proptype" и "propowner".
Я чего-то не понимаю. Я думал, генерируются только те классы, которые надо?
Неужели если имеем например 100 классов, генерируется 10.000 классов для всех возможных пар?
R>get- и set-методы можно сделать аргументами шаблона. R>Тогда размер свойства уменьшится в 3раза.
Да, такая идея интересна, так как использует статическое программирование на этапе компиляции. Если методы доступа известны на этапе компиляции, то зачем это делать во время выполнения (передавать указатели при каждом конструировании). Так что, я полностью согласен с предыдущим оратором.
Но я озадачился другим. Можно ли не хранить вообще никаких дополнительных указателей? То есть может ли класс свойства самостоятельно вычислить указатель на класс-носитель свойства. Эта задача (применительно к подходу из статьи) эквивалентна задаче восстановления указателя на объемлющий объект-композит. То есть если у нас есть композит A, то его поле данных типа B может восстановить указатель на свой контейнер (при условии знания структуры А):
class A
{
public:
class B
{
public:
inline A * Container()
{
// вычисляем смещение поля b_ внутри A
B A::*pB = &A::b;
// базируемся относительно своего thisreturn (A*) ( size_t(this) - *((size_t *)&pB) );
}
//...
}
B b_;
//...
}
A a;
cout << ( & A == A.b_.Container() );
Очевилно, что это вычисление не статическое и происходит во время выполнения программы.
У меня вопрос к аудитории:
Можно ли более элегантно решить именно такую задачу?
Здравствуйте, Atomic Max, Вы писали:
AM> B A::*pB = &A::b; AM> // базируемся относительно своего this AM> return (A*) ( size_t(this) — *((size_t *)&pB) );
AM>У меня вопрос к аудитории: AM>Можно ли более элегантно решить именно такую задачу?
Подсказка: зачем тебе указатель на реальный обьект, если с данными лежащими по этому указателю ты не работаешь?
Здравствуйте, Alexey Chen, Вы писали:
AC>Подсказка: зачем тебе указатель на реальный обьект, если с данными лежащими по этому указателю ты не работаешь?
Видимо, я не понял подсказку. Поясните, пожалуйста.
Да, я не обращаюсь к полям данных на прямую, но я должен вызывать методы объемлющего объекта (реализация "свойства" в контексте обсуждаемой статьи). А по моим сведениям, я не могу вызвать нестатический метод объекта, не имея в распоряжении указателя на сам объект.
_W>int main()
_W>{
_W> std::cout <<sizeof(MegaClass) <<"\n"; //empty class
_W> MegaClass mc;
_W> mc.X() = 10;
_W> int i = mc.Y();
_W> std::string s = mc.Sss();
_W> mc.Sss() = "world";
_W> //проверяю в листинге на asm, что компилятор уничтожает лишние вызовы.
_W> Test2 t;
_W> t.I() = 10;
_W> i = t.I();
_W> std::cout <<i;
_W>}
_W>
Да, идея интересная. Только "свойство" превратилось из поля класса в метод, поэтому надо писать пустые скобки. Интересно, что раньше, реализуя "свойство" через поле данных, я перегружал оператор () так, чтобы он возвращал результат Get-метода. Таким образом у меня появлялась возможность вызывать константные методы оригинального поля данных объекта. Например:
Здравствуйте, Atomic Max, Вы писали:
AC>>Подсказка: зачем тебе указатель на реальный обьект, если с данными лежащими по этому указателю ты не работаешь? AM>Видимо, я не понял подсказку. Поясните, пожалуйста.
Вот пример. Хоть он и не так изыскан как решения на шаблонах
SB>>достоинства иногда побеждают? И какие достоинства вообще существуют кроме наглядности?
A>бывает нужно разделить операцию присваивания для левого и правого оператора на 2 разных A>метода.
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, remark, Вы писали:
R>>Левый и правый оператор присваивания???
RO>http://rsdn.ru/Forum/?mid=577485