2014-10-07 234 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