Итак, я использую композицию для объединения коллекции объектов, все из которых производятся из базового класса, скажем, 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 имеет некоторые общие функции, которые я хочу выполнить в базовом классе Component. Итак, я создаю поток, связанный с базовым классом Component, правильно? Конечно - имеет смысл. Пока я не пойму, что у меня еще нет адреса назначения для этого компонента, потому что объект не был полностью сконструирован. Я хочу развернуть поток базового класса в ctor, но пока не знаю m_address
.
Единственный способ, которым я могу обойти это, - предоставить (простую) виртуальную функцию void start()
, которую производный класс может вызвать, чтобы развернуть поток, как только объект будет полностью построен. Является ли это действительным и подходит выбор дизайна или есть шаблон, который я мог бы игнорировать? Благодарю.
да, конечно. иногда очевидная вещь - правильная вещь. – jdt141