Недавно я работал с небольшим количеством звукового кода, и хотя для понимания вопроса не требуется опыт работы с доменом, я думаю, что это может помочь в моем намерении ,Ссылки, векторы, std :: vector :: at и легко используемые интерфейсы
У меня есть объект-контроллер с std :: vector объектов Audio_channel. Каждый аудиоканал в этом векторе поддерживает состояние каждого канала (воспроизведение, а не воспроизведение ...). Одна конкретная библиотека, которую я использую, работает с обратными вызовами, поэтому вы воспроизводите звук, который вы помечаете как «игра», и когда это делается, происходит обратный вызов, поэтому вы можете пометить его как «незанятый». Для целей этого примера предположим, что Audio_channel :: play_something() существует и работает так, как ожидалось: отметьте как воспроизведение и начните воспроизводить звук, ожидая обратного вызова, когда звук будет выполнен.
Во всяком случае, большую часть времени вы получите воспроизводить звук через объект контроллера, например:
int channel=0;
audio_controller.play_some_sound(channel); //It would really do something like this->channels.at(0).play_something();
И это, конечно, работа с audio_controller действительно владеет этими Audio_channels.
Там будет время, когда вы хотите, канал, то все к себе и хотел бы сделать это:
Audio_channel c=audio_controller.get_me_this_channel(0); //This returns the channel by reference with vector.at(). Try and catch blocks are ommited.
c.play_something();
И хотя он будет работать (так как она оборачивает библиотеку, которая не знает этих абстракций) Я знаю, факт, что этот Audio_channel является копией оригинала и, следовательно, не запрашивается с контроллера (поскольку любые изменения не отражаются).
Я всегда могу пойти:
Audio_channel& c=audio_controller.get_me_this_channel(0);
c.play_something();
И на этот раз я получаю реальное дело, и любые изменения отражаются повсюду ... Дело в том, с точки зрения «вызывающий код» может быть нелогичным силу ссылка там - специально там, где никакая ошибка не будет передана компилятором, так как ошибка не существует. Всегда есть указатели, но я хотел бы держать их под поверхностью. Я думаю, что интеллектуальные указатели также являются опцией, но, опять же, я хотел бы сохранить его как можно ближе к исходному коду.
Какие еще варианты вы можете видеть здесь, что мне может не хватать ?. Я думал об обертке Audio_channel во что-то другое, что делает грязную справочную работу и возвращает копии этого другого интерфейса ... Я бы попадал в много перенаправления кода и методы, которые просто вызывают методы ссылочного канала, но хорошо ..
Как уже говорилось, есть ли что-то, что я могу потерять ?. Я работаю с недавним компилятором gcc, поэтому разрешено использование C++ X11. Большое спасибо.
make 'get_me_this_channel' return reference – Gasim
Фактический прототип Canal_audio & obtener_canal (int) throw(); Он уже возвращает ссылку. Спасибо, в любом случае. –
«специально, где ошибка компилятора не будет устранена, так как ошибки не существует», было бы, если вы сделаете Audio_channel невозможным. Это вариант? Мне кажется, это имеет смысл, так как вы также говорите, что работа с копией имеет свои проблемы. – stijn