Сначала постарайтесь сделать все просто. В дальнейшем всегда есть возможность вырастить / улучшить дизайн. Ниже приведен пример кода, и вот несколько вещей, о которых я думал при его создании:
1) Как уже упоминалось, будь проще. Например, может быть, концепция группы может быть вектором (то есть inst_group_t) для запуска. Вы всегда можете вырастить дизайн позже, когда узнаете больше о нем.
2) Попробуйте уменьшить классовые зависимости. Например, может быть, мне не нужно иметь соединение в качестве переменной-члена. Я могу передать его, когда это необходимо (то есть execute ()). Возможно, обратный вызов не нужно регистрировать (т.е. execute ()), поскольку его 1 connection_c для многих экземпляров inst_c, регистрирующих обратный вызов для каждого inst_c, будет означать, что соединение будет иметь некоторый контейнер. Будьте проще :)
3) Старайтесь использовать как можно больше const и reference (т.е. конструктор connection_c). Будет создано меньше копий конструкторов / временных объектов.
#include <iostream>
class connection_c {
private:
std::string data_;
public:
connection_c(const std::string &data) : data_(data) {
std::cout << "ctor: " << __FUNCTION__ << ":" << data_ << std::endl;
}
};
class inst_c {
private:
int id;
public:
inst_c(int a) : id(a) {
std::cout << "ctor: " << __FUNCTION__ << " " << id << std::endl;
}
typedef void (*execute_callback_t)(int i);
void execute(connection_c& connection, execute_callback_t callback) {
callback(id);
}
};
void mycallback(int id) {
std::cout << "Instance number " << id << " executed" << std::endl;
}
int main() {
typedef std::vector<inst_c*> inst_group_t;
inst_group_t group;
std::string data;
connection_c connection(data);
for (int i = 0; i < 10; ++i)
group.push_back(new inst_c(i) );
for (int i = 0; i < 10; ++i)
group[i]->execute(connection, mycallback);
for (int i = 0; i < 10; ++i)
delete group[i];
return 0;
}