2014-10-07 262 views
0

我不是C++的人,所以一些簡單的東西仍然讓我感動。我正在使用Qt並嘗試完成我的Qt項目(它將用於測試我在原型板上安裝的TCP/IP連接)。在類聲明中聲明一個類對象的指針

在我的主窗口類中,我想包含指向客戶端&服務器對象的指針,這些服務器對象在您按下主窗口窗體上的按鈕時創建。但是當我把這個聲明放在類中時,即使我已經包含了頭文件,它也不會出現,就好像這個類知道它是什麼一樣。

這是我的主窗口類的一個片段:

private: 
    Ui::MainWindow *ui; 
    EchoServer *mServer; 
    EchoClient *mClient; 
... 

的EchoServer的&客戶線出現語法錯誤,然後缺少類型說明符。

但是,當我在按鈕推送事件中的mainwindow.cpp文件中放入相同的聲明時,沒有錯誤!?這裏是該功能的一個片段:

void MainWindow::on_pushButtonConnect_clicked() 
{ 
    const ushort port = 9999; 
    EchoServer *mServer; 

    EchoServer server((const QString)ui->lineEdit_IP_Addr->text(), port, ui); 
    EchoClient client((const QString)ui->lineEdit_IP_Addr->text(), port, ui); 
    ... 

任何想法,我錯過了什麼?

+0

你應該包括,你在你的主窗口頭文件中定義的EchoServer和EchoClient班頭...或者你可以轉發聲明你的EchoServer和EchoClient類,因爲你使用它們的指針 – 2014-10-07 13:32:44

回答

2

您可以簡單地使用向前聲明中像你的頭文件:

class EchoServer; 
class EchoClient; 

class MyClass 
{ 

private: 
    Ui::MainWindow *ui; 
    EchoServer *mServer; 
    EchoClient *mClient; 
}; 
+0

謝謝vahancho!這工作....我認爲它必須是簡單的東西,但我想我仍然不明白爲什麼我需要這個!?我包含了在這個頭文件中定義這些類的頭文件。前向聲明做了什麼,我的頭文件不? Joe B. – 2014-10-07 13:45:50

+1

@JoeB。,實際上你可以同時使用這兩種方法。但是,如果是聲明指針的問題,最好使用前向聲明,因爲編譯器只需知道您使用了正確的名稱。其中一個好處是減少編譯時間。 – vahancho 2014-10-07 14:00:08

+0

@JoeB。你沒有碰巧在這兩個頭文件中包含'mainwindow.h'?因爲你解釋的是[循環依賴]的一個症狀(http://en.wikipedia.org/wiki/Circular_dependency)。 [這個問題](http://stackoverflow.com/questions/396084/headers-including-each-other-in-c)可以幫助你更好地理解這一點。 – thuga 2014-10-08 07:11:57