2013-03-31 1 views
0

много раз приходит естественным, что экземпляры двух или более классов, наиболее вероятные из которых имеют общий заголовочный файл, будут ссылаться друг на друга указателями. например, на графике, край должен ссылаться на его вершины и наоборот. взаимная ссылка сама по себе может быть сделана путем прямого объявления, но я хочу, чтобы оба класса могли взаимодействовать друг с другом, то есть использовать методы или поля друг друга. например, мне бы хотелось, чтобы при соединении ребра с вершиной оба указателя (edge-> myVertex, vertex-> myEdge) могли быть назначены одним методом, который может быть одного из классов. есть ли способ сделать это? спасибо.взаимная ссылка между классами в C++

+0

единственный путь для «я хотел бы, что при подключении края к вершине, оба указателя (edge-> myVertex, вершинно> myEdge) могут быть назначены в одном методе, который может быть либо один из классов. Есть ли способ сделать это? " чтобы происходить взаимный друг из обоих классов. То есть друзья B и друзья B A. –

ответ

1

Способ сделать это - использовать свободные функции, т. Е. Алгоритмы для выполнения этих задач. В противном случае ваши классы теряют свою семантику. Например, вы можете:

void connect_vertices(Vertex<T> v1, Vertex<T> v2, Edge<T> e) { 
} 

функция обработки, что логика.

+0

Я знаю этот вариант, но спасибо в любом случае. еще одна вещь - есть ли веская причина для отсутствия способности делать это с помощью методов? для всего, что я знаю, компилятор уже перебирает код дважды .. почему он не может знать о классе ниже? может ли это создать некоторую проблему, если бы это разрешило? снова спасибо .. – elad

0

Это то, о чем вы думаете?

void Edge::setVertex(Vertex &v) 
{ 
    myVertex = &v; 
    v.myEdge = this; 
} 
+0

точно. теперь, когда вы так выразились, я должен признаться, что почти всегда реализую класс в целом в файле заголовка. может быть, что за пределами заголовка, как вы его написали, все будет хорошо? если да, будут ли у него все еще другие ограничения, связанные с взаимной ссылкой? – elad

+1

@elad: Да, это сработает. Вам нужно будет сделать прямое объявление, но вам все равно придется это делать. Единственная стоимость, которую я вижу, заключается в том, что этот метод должен иметь доступ к 'Vertex :: myEdge'. Чтобы сделать переменную 'public' ужасающей, сделать' Edge' «другом» слишком много, и сделать * этот метод * «друг» - это то, что мне нужно будет искать. (Мне не нравится «дружба» вообще.) – Beta

+0

большое спасибо. Мне также не нравится «дружба», но только в этом смысле ;-) Я попробую это и вернусь сюда, если что-то пойдет не так, или если я найду что-нибудь интересное. – elad

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