2014-10-07 2 views
0

Я не парень из C++, поэтому некоторые простые вещи все еще меня заставляют. Я использую Qt и пытаюсь выполнить мой проект Qt (он будет использоваться для тестирования TCP/IP-соединения, которое я устанавливаю на прото-плате).Объявление указателя на объект класса внутри класса declaraion

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

Вот отрывок из моего класса MainWindow:

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

Клиентские линии EchoServer & получите синтаксическую ошибку, а затем отсутствует спецификаторы типа.

Но когда я помещаю ту же декларацию в файл mainwindow.cpp в событие кнопки push, нет ошибки !? Здесь приведен фрагмент этой функции:

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 классы в файле заголовка MainWindow ... или вы можете переадресовать объявить EchoServer и классы EchoClient, потому что вы используете указатель на них –

ответ

2

Вы можете просто использовать опережающее объявление в файле заголовка, как:

class EchoServer; 
class EchoClient; 

class MyClass 
{ 

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

Спасибо vahancho! Это сработало ... Я подумал, что это должно быть что-то простое, но, я думаю, я до сих пор не понимаю, зачем мне это нужно !? Я включил заголовочный файл, который определяет эти классы в этом заголовочном файле. Что делает объявление вперед, что мой заголовочный файл не работает? Joe B. –

+1

@JoeB., На самом деле вы могли бы использовать оба подхода одинаково. Однако, если речь идет о объявлении указателей, лучше использовать форвардное объявление, потому что компилятор просто должен знать, что вы используете правильные имена. Один, если выгоды от этого сокращают время компиляции. – vahancho

+0

@JoeB. Вы не включили 'mainwindow.h' в один из этих двух заголовков? Потому что то, что вы объяснили, является симптомом [круговой зависимости] (http://en.wikipedia.org/wiki/Circular_dependency). [Этот вопрос] (http://stackoverflow.com/questions/396084/headers-including-each-other-in-c) поможет вам понять это немного лучше. – thuga

Смежные вопросы