2015-03-27 4 views
0

Я знаю, что это может быть глупо, но я не могу понять, что использование этого сценария:несколько классов в файле .h в C++?

  1. У меня есть .cpp и .h с определениями и методами класса (Скажем, класс Class1)
  2. В файле .h файла Class2 он записывает класс Class1 непосредственно перед определением класса для Class2.

Это как исходный код взгляд:

Class1.h

class Class1 
{ //Class 1 definition} 

Class2.h

class Class1; 
class Class2 
{ //Class 2 definition} 

Так почему же класс Class1 появляются в Class2. час? Это огромный исходный код, и я устал от него, так как не могу понять общий поток. Любое объяснение даст большую помощь. Спасибо за помощь!

+1

Это вперед decleration , См. Http://stackoverflow.com/questions/4757565/c-forward-declaration –

ответ

5

Это передовая декларация.

Вы, по сути, говорите компилятору, что Class1 - это класс где-то в другом месте. Он не обязательно должен знать свою фактическую структуру.

Это можно использовать, чтобы избежать циклических ссылок, а также сокращать зависимости.

В данном примере, если вы редактируете содержимое Class1, вам не нужно перекомпилировать единицы перевода, используя только Class2, хотя класс известен.

0

Это называется форвардной декларацией. Это нужно, если Class2 использует Class1, но Class1 еще не определен или не реализован.

+0

Это зависит от значения «uses». – juanchopanza

0

Вероятно, объявление класса 2 требует предварительного объявления класса 1, поскольку указатели или ссылки на объекты Class1 используются в Class2. Возможно, они хранятся как данные элемента или передаются как параметры функции.

Без класса Class1; line, компилятор C++ не знал бы, что такое Class1.

Это форвардное объявление делает компиляцию быстрее, чем включение всего файла заголовка для Class1. Если используются только указатели или ссылки на Class1, включение необязательно.

1
class Class1; 
class Class2 
{ //Class 2 definition} 
}; 

class Class1; является прямой ссылкой. Вы можете взять адрес или сделать ссылку на объекты Class1. Но вы не можете это подтвердить. доступ к любому члену, пока фактическое определение Class1 не отображается.

1

Если классу Class 2 требуется только указатели на Class1, тогда декларация в формате forward - это то, что компилятор должен определить Class1 *. Указатель на класс - это тип компилятора, и ему нужна только информация, тип которой существует где-то.

Что вы достигаете здесь нет:

  • нет циклических ссылок (которые часто являются кровать запах архитектуры)
  • нет зависимостей
  • меньше включать
+0

То, что вы говорите о «только указателях», неверно. – juanchopanza

+0

@juanchopanza, что именно неверно? Что больше, чем форвардное объявление класса 1, необходимо, чтобы компилятор знал, как генерировать тип Class1 *? Мой ответ не охватывает весь вопрос, но об этом никто раньше не упоминал, и я нашел его связанным. – senfen

+0

ОК, это не так, но это ошибочно неполно. Есть много других ситуаций, когда вы можете использовать форвардные объявления. – juanchopanza

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