Итак, я использую композицию, чтобы собрать коллекцию объектов, каждый из которых является производным от базового класса, скажем, Component. Например:
class Component {
public:
Component();
...
private:
int m_address;
...
};
class SpecializedComponent: public Component {
public:
SpecializedComponent()
... //and so on
};
class SpecializedComponent2: public Component {
public:
SpecialIzedComponent2()
... //and so on
};
class ComponentHolder{
SpecializedComponent* m_descriptiveName;
SpecializedComponent2* m_descriptiveName2;
// and so on... many different types of components
}
Таким образом, каждый SpecializedComponentX будет связываться по сети с отдельным источником данных, каждый со своим уникальным адресом. Эти адреса указаны в файле параметров. В данный момент я анализирую файл параметров, и m_address
инициализируется в конструкторе производного класса - это потому, что каждый m_address определяется типом объекта, который мы инициализируем.
Каждый SpecializedComponentX имеет некоторые общие функции, которые я хочу выполнить в компоненте базового класса. Итак, я раскручиваю поток, связанный с компонентом базового класса, верно? Конечно - имеет смысл. Пока я не пойму, что у меня еще нет адреса назначения для этого компонента - потому что объект не был полностью построен. Я хочу раскрутить поток базового класса в ctor, но я пока не знаю m_address
.
Единственный способ обойти это - предоставить (простую) виртуальную функцию void start()
, которую производный класс может вызывать для ускорения потока после того, как объект полностью построен. Это допустимый и соответствующий выбор дизайна или есть шаблон, который я мог бы пропустить? Благодарю.