Несколько раз мне приходилось писать код вроде следующего:
class Bar;
class Foo
{
std::list<Bar*> _barlist;
protected:
AddBar(Bar *bar) { _barlist->push_back(bar); }
И куча невиртуальных функций _barlist использующих
};
class MyFoo : public Foo
{
MyBar1 bar11, bar12;
MyBar2 bar21, bar22;
MyFoo() : bar11(...), bar12(...), ba21r(...), bar22(...)
{
Foo::AddBar(&bar11);
Foo::AddBar(&bar12);
Foo::AddBar(&bar21);
Foo::AddBar(&bar22);
}
};
У меня такой код вызывает ощущение, что написано много лишнего: каждый bar упоминается три раза. bar'ы это обертки для типов вроде int или string.
Смысл: Я хочу иметь список переменных класса для, например, записи в файл или для того чтобы связать контролы в диалоге с переменными. А на самом деле для всего сразу.
Был вариант такой:
class Bar
{
Bar(Foo *f) { f->AddBar(this); }
};
Но компилятор волнуется ( и правильно делает ), а вместе с ним и я.
Был еще вариант, когда Bar был не оберткой для значения, а хранил указатель на переменную класса и динамически создавался в конструкторе Foo.
MyFoo::MyFoo() : value(100)
{
Foo::AddBar(new MyBar(&value));
}
Но здесь другие преимущества, количество упоминаний то же.