Однолинейное определение класса? - PullRequest
7 голосов
/ 02 июня 2009

Я обновляю некоторый код, и пока я работал в заголовке, я наткнулся на следующую строку.

.
.
.
class HereIsMyClass;
.
.
.

Вот и все. Это просто одна строка, предшествующая другой, более длинному определению класса. Здесь IsMyClass фактически является другим классом где-то еще, но я не понимаю, почему эта строка написана здесь. Что это делает?

Ответы [ 4 ]

27 голосов
/ 02 июня 2009

Эта строка в C ++ является предварительным объявлением. Он заявляет, что в какой-то момент в будущем класс с именем HereIsMyClass, вероятно, будет существовать. Это позволяет вам использовать класс в объявлении до его полного определения.

Это полезно как для разделения циклически зависимых классов, так и для управления заголовочными файлами.

Например

class HereIsMyClass;

class Foo { 
  void Bar(HereIsMyClass* p1) ...
};

class HereIsMyClass {
  void Function(Foo f1);
}
4 голосов
/ 02 июня 2009

Это называется "предварительная декларация". Это сообщает компилятору, что HereIsMyClass - это имя класса (в отличие от имени переменной, функции или чего-то еще). Класс должен быть определен позже, чтобы его можно было использовать.

Это полезно, когда у вас есть классы, которые должны ссылаться друг на друга.

Вот одно описание.

3 голосов
/ 02 июня 2009

Это то, что называется предикларацией . Вероятно, после этой строки есть определение класса, в котором используется HereIsMyClass, когда фактическое объявление HereIsMyClass находится ниже в файле или в другом #include, включенном далее в файл.

Если у вас нет этой строки, возможно, файл не скомпилируется.

1 голос
/ 02 июня 2009

Это называется "предварительным объявлением", которое, по сути, является обещанием определить этот класс позже. Наличие предварительного объявления позволяет вам объявить указатели на HereIsMyClass без необходимости включать в него заголовочный файл, но не фактические его объекты, потому что размер объекта HereIsMyClass все еще неизвестен компилятору.


class HereIsMyClass;

class Foo
{
private:
  HereIsMyClass *pointer; // works
  HereIsMYClass object;   // compiler error!
};

Форвардное объявление ничего не говорит компилятору о членах класса, поэтому вам все равно нужно включать полное определение класса (файл заголовка) всякий раз, когда вы его фактически используете, т.е. е. получить доступ к своим членам.

...