2012-03-14 2 views
2

Скажем, у меня есть класс объектов, называемый Computer. Тогда скажите, что у меня есть другой класс под названием Wire. (Эти названия используются, чтобы просто объяснить, что я пытаюсь сделать, настоящие немного сложнее)Проблема создания сетевых объектов

struct Computer { 
std::vector<Wire *> wires; 
}; 

struct Wire { 
Computer * computers[2]; 
}; 

Так скажем, теперь у меня есть класс компьютера, и вы хотите сделать что-то для всех компьютеров он подключается через провода. Я мог бы петлю через все провода и иметь метод в проводе, так что компьютер делает:

wire->doSomething(this,blahblah) 

поэтому провод находит другой компьютер, проходит через список проводов, и делает то же самое:

otherWire->doSomething(&otherComputer,blahblah) 

(конечно, он пропускает, когда попадает в список).

Это работает, но когда есть круговая связь, он создает бесконечный цикл вызова doSomething всем шарам, непрерывно. Каков наилучший способ предотвратить это, или есть лучшее общее решение этой проблемы?

+2

* Помимо *: реальные сети имеют [та же проблема] (http://en.wikipedia.org/wiki/Bridge_loop), хотя они [решают это по-другому] (http://en.wikipedia.org/wiki/Spanning_tree_protocol). –

ответ

2

У вас есть направленный, циклический график.

Обычно вы хотите использовать свойство «посещено» для каждого узла, а затем убедитесь, что оно еще не было посещено до посещения каждого узла.

В полу-псевдокоде вы могли бы сделать:

std::map<Wire*,bool> visited; // Outside the search, so that it's not local 

if (!visited[otherWire]) { 
    visited[otherWire] = true; 
    otherWire->doSomething(&otherComputer,blahblah) 
} 
+0

Я вижу. Но нужно ли мне очищать посещаемые переменные после каждой проводной операции? – slartibartfast

+0

@myrkos Вам нужно иметь один список посещенных узлов для каждого поиска. (Если он глобальный, и вы его сбросили, то вы не являетесь реентератором, который может/не может быть проблемой). Тем не менее, возможен сброс и использование только одного одновременного поиска. Другой - передать ссылку на карту «visit» во время поиска. – Flexo

+0

@myrkos - Это не работает для общего случая, представьте себе цикл в вашем графике, который не начинается с узла, с которого вы начали. Если вы знаете, что единственный способ, которым могут начать циклы с вашей конкретной проблемой, - это то, что было бы хорошо, но это не обобщает. – Flexo

Смежные вопросы