Наиболее красивый и правильный способ передачи параметров сквозь другой класс?
Приветствую!
Частенько сталкиваюсь с тем, что например:
Есть класс, например CamsList, где соответственно идёт работа со списком камер (добавление,изменение, удаление и тд)
есть другой класс, например Cam - сам объект камеры.
Допустим самой камере для работы нужен общий класс для всех камер OutputBuffer (Который нафиг не нужен CamsList).
Т.е. у меня получается либо по указателю пробрасывать класс через CamsList и в дальнейшем при создании в нём новой камеры в её конструкторе указывать этот указатель, либо использовать синглтон.
Ни то, ни то не нравится. Какие есть ещё способы, как бы вы поступили?
#include <iostream>
class Cam;
class OutputBuffer {
public:
OutputBuffer() { std::cout << "OutputBuffer " << this << " initialized\n"; }
void receive(Cam &cam) { std::cout << "OutputBuffer " << this << " receiving data from camera " << &cam << "\n"; }
};
class Cam {
static OutputBuffer buffer;
public:
Cam() { buffer.receive(*this); }
};
OutputBuffer Cam::buffer = OutputBuffer();
int main() {
Cam cam1, cam2;
};
OutputBuffer 0x6013d1 initialized
OutputBuffer 0x6013d1 receiving data from camera 0x7fff7742970e
OutputBuffer 0x6013d1 receiving data from camera 0x7fff7742970f
Pavel K: В данном случае он и есть зло. Если статик используется только в одном методе - на кой его делать членом класса? Проще объявить статик-переменную внутри самого метода. И не придется где-то как-то инициализировать этот член (частая ошибка - забывают про инициализацию или дублируют ее).
Adamos: реализовал и столкнулся с проблемой, что придётся в других классах так же делать, что бы иметь доступ к OutputBuffer. Как всё таки тогда красивее сделать?
Допустим самой камере для работы нужен общий класс для всех камер OutputBuffer
То, что он общий, ничего не значит. Работать с ним надо так, будто он индивидуальный для каждой камеры.
Передаёшь его каждой камере при её инициализации. А уже готовая камера (которая знает, куда выводить) добавляется в список камер.