создать цепочку из абстрактного класса - PullRequest
0 голосов
/ 11 июля 2019

У меня есть задание, поэтому я на самом деле не ищу кого-то, чтобы решить его, просто хочу понять, что на самом деле запрашивается, потому что я чувствую, что оно плохо сформулировано.

1. Please implement the function described in the comment of this incomplete code snippet



// AudioEffect is the base class for effects that can process
// audio and have a subsequent effect (next).
struct AudioEffect {
virtual ~AudioEffect() = default;
virtual void process(float* buf, size_t num) = 0;
std::shared_ptr<AudioEffect> next;
};
// Implement a function that checks if there is a feedback loop
// in the effects chain.
... detect_feedback(...)
{
}

Ответы [ 3 ]

1 голос
/ 11 июля 2019

Единственный цикл, который я вижу для подтверждения, находится в цепочке указателей.

Так что вам придется следовать за указателем next и убедиться, что вы никогда не встретите один и тот же эффект дважды.

0 голосов
/ 14 июля 2019

Вы должны создать связанный список эффектов, затем пройти по списку и проверить use_count каждого общего указателя. Если оно больше 2, значит, обратная связь существует.

0 голосов
/ 11 июля 2019

Вы должны проверить, является ли данный график циклическим.

Аргументы функции должны быть контейнером std::shared_ptr<AudioEffect> объектов. Возвращение bool.

Для каждого элемента в контейнере используйте BFS или DFS, чтобы пройти по графику. Каждый узел должен быть объединен с индикатором, значение которого сначала равно 0 и становится 1 после посещения. Программа должна проверить индикатор перед посещением узла. Если это 1, то график циклический. Вы можете выбросить исключение или разорвать цикл, чтобы выйти из поиска.

Вы должны изучать структуры данных и алгоритмы. Давай!

...