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

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

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

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

27.08.2012, 19:50. Просмотров 1980. Ответов 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
Кроме того в одном месте прочитал, что это ускоряет компиляцию и в то же время прочел, что это увеличивает расход памяти у компилятора и вообще может привести к замедлению компиляции. Кому верить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2012, 19:50     Зачем нужно опережающее объявление класса в заголовке?
Посмотрите здесь:

Зачем нужно использовать инициализаторы элемент-данных класса? - 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
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
27.08.2012, 19:56  [ТС]     Зачем нужно опережающее объявление класса в заголовке? #3
Ну его ведь можно определить простейшим вызовом #include "newtype.h" , что с виду логичнее, плюс автодополнение в редакторе появляется
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
27.08.2012, 20:01     Зачем нужно опережающее объявление класса в заголовке? #4
Иногда так делают для полного сокрытия реализации класса NewType.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.08.2012, 20:18     Зачем нужно опережающее объявление класса в заголовке? #5
Предопределение класса
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2012, 20:21     Зачем нужно опережающее объявление класса в заголовке?
Еще ссылки по теме:

Объявление структуры и класса - C++
Ругается на строку obj_cls.prv=3; и на объявление класса. Что у меня не правильно? #include <iostream> using namespace std; ...

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

Объявление класса Point - C++
Объявил класс Point в заголовочном класса для хранения значений координат x,y а далее класс Rectanagle и вот в классе Rectanagle каждая...

Объявление объекта класса - C++
Доброе время суток! Дело вот в чем: В конструкторе c параметрами класса Piramida, мне нужно создать объект класса M_Ygolnik с...

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

Предварительное объявление класса - C++
Имеется код такого вида: class IBase { public: virtual foo() = NULL; .. .. .. };


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

Или воспользуйтесь поиском по форуму:
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 и наоборот - в результате не компилировалось - выход был только один - предопределение класса.
Yandex
Объявления
27.08.2012, 20:21     Зачем нужно опережающее объявление класса в заголовке?
Ответ Создать тему
Опции темы

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