2016-09-28 6 views
-5

Предположим, что у нас есть два класса Foo и Bar. Мы можем объявить класс Foo и использовать его методы следующим образом:В чем разница между форвардом, объявляющим класс, и объявлением переменной класса?

#include"foo.h" 

Foo foo 

class Bar{ 
    Bar(){ 
     foo.method1(); 
    } 
} 

И мы имеем опережающее объявление, которое стоит объявить класс Foo следующим образом:

#include"foo.h" 

class Foo 

class Bar{ 
    Bar(){ 
    } 
} 

Каковы основные различия между двумя декларациями, и когда предварительная декларация предпочтительнее обычной декларации?

+0

Полезная ссылка: https://www.quora.com/What-exactly-is-the-difference-between-the-declaration-of-a-class-and-a-definition-of-a-class –

+0

в вашем втором примере 'Foo' никогда не используется, поэтому я не понимаю ваш вопрос – bolov

+1

Возможный дубликат [C++ - Forward декларация] (http://stackoverflow.com/questions/4757565/c-forward-declaration) – dkg

ответ

1

Во втором случае вам не нужно

#include"foo.h" 

В прямом объявлении вы просто сказать компилятор «Есть Foo класс где-то. Но я не знаю, как он выглядит». Поэтому компилятор может ссылаться на них, но не может их использовать;

class Foo; //Forward declaration. 

Foo* foo; // ok. Just pointer. 
Foo foo;// error. Compiler can't instantiate object. 

и

#include "foo.h" 

Foo* foo; // ok. Just pointer. 
Foo foo;// ok. Compiler can instantiate object. 

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