Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
#1

Зачем нужно опережающее объявление класса в заголовке? - C++

27.08.2012, 19:50. Просмотров 2037. Ответов 5
Метки нет (Все метки)

Часто натыкаюсь на такой код:
C++
1
2
3
4
5
6
7
8
9
class NewType;
 
class Class1
{
public:
   Class1();
private:
   NewType *field;
};
а в определении класса
C++
1
2
3
4
5
6
#include "newtype.h"
 
Class1::Class1()
{
   field = NewType();
}
Прочитал в вики и на других форумах, что это якобы предотвращает цикличиские ссылки двух заголовочных файлов. Но не пойму, чем не угодила директива препроцессора
C++
1
2
3
4
#ifndef NEWTYPE_H
#define NEWTYPE_H
....
#endif
Кроме того в одном месте прочитал, что это ускоряет компиляцию и в то же время прочел, что это увеличивает расход памяти у компилятора и вообще может привести к замедлению компиляции. Кому верить?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2012, 19:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Зачем нужно опережающее объявление класса в заголовке? (C++):

Зачем нужно использовать инициализаторы элемент-данных класса? - C++
Имеется фрагмент кода. Если быть точным, то описание класса. #include <iostream> #include <ctime> #include <Windows.h> using...

зачем в с++ писать в объявление функции const ? - C++
Доброго времени суток. Ответе на мой вопрос пожалуйста зачем в с++ писать в объявление функции const ? Пример : string MyFunc() const; ...

Объявление объекта класса fstream в качестве статической компоненты другого класса - C++
Доброго времени суток. Есть задание, в котором говорится "...Перепишите программы из упражнений 4 и 6 таким образом, чтобы использовать...

Создать объявление класса и разработать программу-драйвер, которая продемонстрирует работу класса. - C++
Класс Triangle (треугольник). Класс хранит Декартовы координаты трех углов треугольника. Конструктор принимает три группы координат. Должны...

Объявление объекта одного класса в описании другого класса - C++
Здравствуйте. Почему при объявлении Student s в классе Teacher не возникает ошибки? Ведь такой объект уже существует. И почему при...

Объявление дружественного класса внутри класса - C++
class A{ friend class B{ B(A &a); } } Подскажите пожалуйста, такое возможно или нет, я хотел чтобы...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
27.08.2012, 19:52 #2
Зачем нужно опережающее объявление класса в заголовке?
затем, что класс NewType еще не определен, а он уже используется в классе Class1
0
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
27.08.2012, 19:56  [ТС] #3
Ну его ведь можно определить простейшим вызовом #include "newtype.h" , что с виду логичнее, плюс автодополнение в редакторе появляется
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
27.08.2012, 20:01 #4
Иногда так делают для полного сокрытия реализации класса NewType.
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.08.2012, 20:18 #5
Предопределение класса
1
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
27.08.2012, 20:21 #6
Цитата Сообщение от Toshkarik Посмотреть сообщение
Иногда так делают для полного сокрытия реализации класса NewType.
А иногда это единственный способ, чтобы программа нормально заработала

Добавлено через 1 минуту
Цитата Сообщение от Buckstabue Посмотреть сообщение
Ну его ведь можно определить простейшим вызовом #include "newtype.h"
Ну у меня был случай когда файл A.h ссылался на B.h и наоборот - в результате не компилировалось - выход был только один - предопределение класса.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2012, 20:21
Привет! Вот еще темы с ответами:

Объявление класса с шаблоном - C++
Пишу в Qt. Создал класс с шаблоном matrix.h #ifndef MATRIX_H #define MATRIX_H template <class T> class Matrix {

Объявление объектов класса - C++
Как инициализировать объекты класса вне функции main, но и не в глобальной области? Объявленные объекты занимают много пространства в...

Двойное объявление класса - C++
Для чего два раза писать class Animal? class Animal; void setValue (Animal&, int); class Animal { public: Animal(); ...

Объявление класса Patient - C++
Доброго времени суток! Есть программа, в ней несколько файлов. Есть класс Patient, на который создается указатель в файле...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.08.2012, 20:21
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru