Какова цель предописания?

что является описанием или значением этого: например:

class test;

class test
{
  .....
};
5
задан Lazer 24 June 2010 в 14:20
поделиться

6 ответов

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

class B;

class A {
  B* b;
};

class B {
  A* a;
};

Без прямой ссылки на B, компилятор не смог бы успешно проанализировать определение для A, и вы не можете решить проблему, поставив определение B перед A.

В таком языке, как C #, который требует двухпроходный компилятор, вам не нужны прямые ссылки

class A {
  B b;
}

class B {
  A a;
}

, потому что первый проход компилятора просто берет все определения символов. Когда компилятор делает свой второй проход, он может сказать: «Я знаю, что B - это класс, потому что я видел определение на моем первом проходе».

22
ответ дан 18 December 2019 в 05:30
поделиться

Сначала класс объявлен , затем он определен .

Объявление: оно просто сообщает компилятору: Хорошо, вот что-то (метод, класс и т. Д.), Что может быть использовано заданным именем. Он просто связывает данное имя с чем-то.

Определение: Он сообщает компилятору: Хорошо, вот что (и как) методы, классы и т. Д. На самом деле делают свое дело. Если что-то определено, то компилятор фактически выделяет для этого пространство.

Вы можете посмотреть здесь .

4
ответ дан 18 December 2019 в 05:30
поделиться

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

0
ответ дан 18 December 2019 в 05:30
поделиться

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

0
ответ дан 18 December 2019 в 05:30
поделиться

Первая строка - это так называемое прямое объявление. Она переносит имя класса в текущее пространство имен без его фактического определения.

1
ответ дан 18 December 2019 в 05:30
поделиться

Компилятору требуется определение класса, если осуществляется доступ к членам/методам этого класса или если необходимо узнать его размер. В других случаях достаточно прямого объявления. Это экономит время компиляции. Пример:

class A { 
  B m_b; 
  C* m_ptrC;
}; 

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

a.h:

#ifndef A_H
#define A_H

#include <b.h>
class C;

class A
{
  B m_b;
  C* m_ptrC;
}
#endif

Прямое объявление c (вместо включения c.h, что также возможно) избавляет вас от необходимости разбирать c.h всякий раз, когда вы включаете a.h. В большом проекте это может сэкономить много времени на компиляцию. Другим преимуществом является то, что изменения в c.h не вызывают перекомпиляции для a в этом случае. Я не знаю, распознает ли компилятор это, если вы включите c.h вместо прямого объявления.

Для получения дополнительной информации попробуйте разобраться в pimpl-idiom (просто погуглите на эту тему. вы получите много ссылок).

Конечно - в a.cpp, если вы действительно что-то делаете с указателем на c (например, m_ptrC->Add()), вам нужно будет включить c.h. Но a.cpp читается только один раз, тогда как заголовочный файл читается n раз с большим n для классов, которые используются очень часто в больших проектах.

Прямое объявление также позволяет создавать круговые зависимости. Пример:

class B;

class A {
 B* m_ptrB;
}

class B {
 A* m_ptrA;
}

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

Дополнительная информация: C++ FAQ

Спасибо за комментарий о круговых зависимостях, я просто забыл о них.

7
ответ дан 18 December 2019 в 05:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: