2012-03-17 115 views
2

沒有定義,我沒有太多的經驗與C++和我有一個關於從Qt文檔這裏如下的問題:http://qt-project.org/doc/qt-4.8/mainwindows-application-mainwindow-h.html類聲明在C++

class QAction; 
class QMenu; 
class QPlainTextEdit; 
(系4-6頂部的評論後)

由於QAction,QMenu和QPlainTextEdit是Qt的庫類(點擊它們導致它們的文檔頁面),不應該使用'#include'包含它們嗎?用關鍵字'class'聲明它們有什麼用途?據我所知,編譯器會將它視爲一個全新的類,與庫類QAction無關。

但是,'mainwindow.cpp'文件(http://qt-project.org/doc/qt-4.8/mainwindows-application-mainwindow-cpp.html)不包含類QAction的任何定義,儘管它的對象正在代碼中使用。

這是怎麼回事?

編輯:問題

考查類主窗口(http://qt-project.org/doc/qt-4.8/mainwindows-application-mainwindow-cpp.html)的createActions方法中創建的進一步解釋。在這裏,類QAction的對象正在創建,但我無處可以找到QAction類的定義。

回答

0

該類的類型完全由其完全限定名稱(不確定這是官方術語,但無論如何),其中包括其名稱空間和名稱。它是來自頭文件還是簡單地宣佈爲原地並不重要。

事實上,包含頭文件基本上只是將該頭文本插入到包含文件出現的源代碼點。效果與使用您最喜愛的文本編輯器替換頭文件內容的#include完全相同。無論哪種方式,編譯器本身只會看到一個令牌流。

使用前向聲明的主要目的是通過減少它必須解析的文本的數量以及它在RAM中構建的符號表的大小來加速編譯器。我發現這種做法在我的工作中很大程度上是不必要的,但是非常大的項目可能仍然受益。

11

聲明一類,而不是定義它,足以讓編譯器知道,某名是指一個類型的事實,並允許您使用在特定的設置類型。具體而言,已宣告但尚未定義的類型是不完全類型,並可以以多種方式使用不完全類型:

  • 在函數聲明,函數的返回類型和參數類型可能是不完整(當然不是在函數的定義)*

  • 如果T是一個不完整的類型,然後T*T&,以及它們的CV-合格版本,是完全類型。

所以,你可以寫:

class Foo; // we only need to know that `Foo` names a type. 

struct Bar { Foo * p; }; // complete definition of `Bar`. 

Foo mangle(Foo x, Foo y); // function declaration 

可以聲明一個類,或任何類型爲此事,往往你喜歡。唯一必須是唯一的是定義(因此「一個定義規則」)。

*)有一個例外:void總是不完整的,您可以通過不返回任何內容返回void類型。

+0

OKay。我明白這個事實。但是,如果您查看MainWindow類中的createActions方法的第一行(http://qt-project.org/doc/qt-4.8/mainwindows-application-mainwindow-cpp。HTML),QAction類的構造函數被調用,但沒有任何地方被定義。你怎麼能調用一個尚未定義的方法? – aakashbhowmick 2012-03-17 10:32:08

+1

在MainWindow文件中,它們#include 。我沒有看過它,但是沒有提到QAction的真正宣言? – deong 2012-03-17 11:20:12

3

這些被稱爲「」的類。它被用來使編譯器知道這些符號指的是後面將要定義的類。這些可以在頭文件中用來聲明一個符號是一個類,避免包含它的頭,這在某些情況下可能是需要的(例如循環包含)。

無論如何你不能總是使用前向聲明,因爲編譯器可能需要知道如何定義一個類。在其他情況下,編譯器只需要知道它實際上是一個類。

編輯:要回答您添加的以下問題,請查看可在* qt_install_dir */include/QtGui中找到的QtGui文件。在我的Qt 4.8的安裝我看到裏面:

#include "qaction.h" 

然後往裏qaction.h:你會看到的QAction類的完整定義。頭文件QtGui包含在mainwindow.cpp的開頭,這使得QAction成爲一個完整的類型。

-2

前幾天我剛剛開始研究這個例子。因此,這裏的結論爲什麼我認爲你需要這些:

我猜,如果你想看看在.pro文件中你會看到一條線,就像:

QT += core 
QT += gui 

所以事情你是在告訴Qt編譯器和編譯器你正在使用QtGui和QtCore模塊,並且在那些模塊中你已經定義了QAction等。因此,作爲一個「黑客」(因爲他們的IDE無法在編譯過程的後期階段自動檢測到),所以您預先聲明瞭這些類,以避免編譯階段發生任何錯誤。最後,Qt插入模塊,一切正常。

第一次做這件事時,這讓我很頭疼,但這是我能得到的唯一合理解釋。

如果不預先聲明的類,你會得到一個錯誤,指出它無法找到類等

編輯任何參考: 在你最近更新的光,我建議您將轉到YouTube並在暱稱下搜索用戶:voidrealms。他有很好的C++ Qt視頻教程和解釋,並且還展示了QMenu,QAction等。他擁有150多個關於Qt C++編程的視頻,涵蓋了從基本的Hello World一直到網絡編程甚至更遠的一切......檢查他,他還有其他教程以及

+0

在我看來,它也必須是這樣的。但這是糟糕而令人困惑的編程。如果這是真的,文件應該清楚地說明。 – aakashbhowmick 2012-03-17 10:35:13

+0

雖然Qt是一個很好的跨平臺框架,並且具有體面的文檔,但我認爲這些示例應該更具描述性。然而,沒有什麼比通過艱難的方式學習更加困難:試驗和錯誤:P – 2012-03-17 11:00:19

+0

另外,如果您注意到您不能使用網絡模塊或sql模塊,除非您在.pro文件中指定它們,即使您將它們包含在程序,這有點令人困惑 – 2012-03-17 11:01:47