2017-02-03 67 views
0

我對某件事有疑問,真讓我困惑!「class示例」是什麼?是否在頭文件中?

讓我們看這個代碼右擊這裏:

#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

這是類 – UnholySheep

+0

的[前向聲明](http://en.cppreference.com/w/cpp/language/class#Forward_declaration)謝謝,現在有道理!這些日子,前瞻性聲明仍然很重要嗎? – Lazcano

+1

這樣你就可以在定義前引用前面聲明的類。應該指出的是,如果在定義之前被引用,它將是一個不完整的類型。 (即你只能在定義之前聲明前面聲明的類的指針或引用類型) – George

回答

7

是什麼class example;class anything_else;意味着

他們是類exampleanything_else的聲明。他們告訴編譯器這些是有效的類名。這種聲明被非正式地稱爲「前向聲明」。

while class A {};獲取聲明?

class A得到定義爲

裏面的CPP文件,我看到像void example::release() { ... }定義等等...

這就是功能example::release的定義。

某處的example的定義,有函數的聲明:

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

如果example只聲明,不定義,那麼example::release導致編譯錯誤的定義。

+0

現在有道理!非常感謝你! (: – Lazcano

2

如果你想有一個尚未包含的類型的成員變量你做一個正向聲明的類型。

class X; 

forward forward declare the class X so you can have a。例如在我們的類聲明中指向該類的指針。

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

之後,您必須在您的.cpp文件的某處提供該類的定義。

+0

'class Y {/ * ... * /};'不是類聲明,而是類的定義 –

+0

謝謝!:)我仍然需要了解「定義」和「聲明」 – Lazcano

+0

@ChristianHackl好吧取決於課程中的內容,如果只有內聯函數的定義,那麼是的,這是一個定義。但如果您在.cpp文件中提供定義,那麼它就是一個聲明。例如Y類{public:Y(); };是.cpp中的聲明Y:Y(){..}定義 –

相關問題