2017-02-03 24 views
0

У меня вопрос о чем-то, что меня действительно смущает!Что такое «классный пример»? означает в файле заголовка?

Давайте смотреть этот код RIGH здесь:

#ifndef HEADER_H 
#define HEADER_H 
#include <iostream> 

class example; 
class anything_else; 

class A { 
     public: 
      A(); 
}; 

... 

Что class example; и class anything_else; значит, пока class A {}; получает объявлен? Внутри файла CPP я видел такие определения, как void example::release() { ... } и т. Д.

Я действительно смущен, у кого-нибудь есть пример с class example; ...?

Поздравления!

+2

Это [форвардная декларация] (http://en.cppreference.com/w/cpp/language/class#Forward_declaration) класса – UnholySheep

+0

Спасибо, теперь это имеет смысл! В настоящее время важны форвардные декларации? – Lazcano

+1

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

ответ

7

Что class example; и class anything_else; означают

Они деклараций классов example и anything_else. Они сообщают компилятору, что они являются допустимыми именами классов. Такую декларацию неофициально называют «форвардной декларацией».

в то время как class A {}; заявлен?

class A получает определяется.

Внутри файла CPP я видел определения как void example::release() { ... } и так далее ...

Это определение функции example::release.

Где-то в определении example, есть объявление функции:

class example 
{ 
// ... 
    void release(); // declaration 
}; 

Если example только объявлен и не определен, то определение example::release приводит к ошибке компиляции.

+0

Теперь это имеет смысл! Большое вам спасибо! (: – Lazcano

2

Если вы хотите иметь переменные-члены того типа, которые еще не были включены, вы делаете форвардную декларацию.

class X; 

Вперед объявляет класс X, чтобы вы могли иметь. например указатель на этот класс в нашем объявлении класса.

class Y 
{ 
... 
    X* p; 
}; 

позже вы должны предоставить определение класса где-то в вашем .cpp-файле.

+0

'class Y {/ * ... * /};' не является объявлением класса, а определением класса. –

+0

Спасибо! :) Мне все еще нужно узнать о «определении» и «декларации» – Lazcano

+0

@ChristianHackl хорошо зависит от того, что находится в классе, если у вас есть только встроенные определения ваших функций, то да, это определение. но если вы укажете определения в файле .cpp, то это объявление. например класс Y {public: Y(); }; является объявлением в .cpp Y: Y() {..} определение –