Название: [решено] Область видимости Отправлено: serg_hd от Март 19, 2010, 16:44 Вот и я решил перейти с java на с++, не в последнюю очередь из-за Qt. Это конечно меня весьма радует, но и головной боли добавило.
Есть 2 заголовочных файла, в которых кроме инициализации лежит и реализация, писались не с помощью Creator'a. Проблема в том, что не знаю как из класса 2го файла обратится к объекту класса (главному окну) 1го файла: MainForm.h: Код: #ifndef _UI_FORM_H Файл ThreadManager.h: Код: #ifndef _THREADMANAGER_H Название: Re: Область видимости Отправлено: lit-uriy от Март 19, 2010, 17:08 во-первых, класс ThreadManager, не наследник QObject, и от макроса Q_OBJECT толку никакого
во-вторых, пиши объявление класса (наследника QObject) в h-файле, а реализацию в cpp-файле, это от многих головников избавит. В h-файле делаешь предварительное объявление (forward declaration): class MainWindow; , а в cpp-файле подключаешь его заголовочник: #include "MainWindow.h" Название: Re: Область видимости Отправлено: serg_hd от Март 19, 2010, 17:29 А в случае с ThreadManager вообще надо наследоваться от QObject (Q_OBJECT я пока убрал)? Если да, то зачем? В конструктор я просто передаю указатель на главное окно, не понимаю почему ошибка.
Название: Re: Область видимости Отправлено: lit-uriy от Март 19, 2010, 17:40 А в случае с ThreadManager вообще надо наследоваться от QObject (Q_OBJECT я пока убрал)? Если да, то зачем? надо если тебе нужна его функциональность, например:сигналы и слоты, родственные отношения объектов - можно создать объект динамически передав ему родителя, и тогда родитель будет отвечать за время жизни объекта, его не нужно будет удалять вручную. (в Ява, ты этого вообще никогда не делаешь, т.к. есть сборщик мусора) В конструктор я просто передаю указатель на главное окно, не понимаю почему ошибка. "...incomplete type 'struct MainWindow'", т.е. тип не известен, о нём лишь сказано, что есть, но его описания нетНазвание: Re: Область видимости Отправлено: Igors от Март 19, 2010, 18:51 В конструктор я просто передаю указатель на главное окно, не понимаю почему ошибка. Код: Файл ThreadManager.h: Код: #include "MainWindow.h" Название: Re: Область видимости Отправлено: serg_hd от Март 19, 2010, 19:01 Конечно же я пробовал #include "MainForm.h" для файла ThreadManager.h, не помогает. Да и по логике вещей: в MainForm.h будет заинклуден ThreadManager.h, а в ThreadManager.h - MainForm.h. Ерунда какая-то...
Название: Re: Область видимости Отправлено: Igors от Март 19, 2010, 19:16 Конечно же я пробовал #include "MainForm.h" для файла ThreadManager.h, не помогает. Да и по логике вещей: в MainForm.h будет заинклуден ThreadManager.h, а в ThreadManager.h - MainForm.h. Ерунда какая-то... Конечно не поможет если в MainForm.h будет заинклуден ThreadManager.h. Ведь тогда сработает "страж включения" (#ifndef). Делайте по классике - переносите тела в cpp а там уже вставляйте любые #includeНазвание: Re: Область видимости Отправлено: serg_hd от Март 19, 2010, 20:22 Конечно же я пробовал #include "MainForm.h" для файла ThreadManager.h, не помогает. Да и по логике вещей: в MainForm.h будет заинклуден ThreadManager.h, а в ThreadManager.h - MainForm.h. Ерунда какая-то... Конечно не поможет если в MainForm.h будет заинклуден ThreadManager.h. Ведь тогда сработает "страж включения" (#ifndef). Делайте по классике - переносите тела в cpp а там уже вставляйте любые #includeХорошо, тогда другой вопрос. Допустим в проекте у меня 50 файлов (на данный момент именно .h-файлов и 1, главный .cpp). Мне их надо раскидать "по тематике". В яве это, например, пакеты. Т.е. в проекте может быть несколько файлов с одинаковыми названиями, но за счёт того, что они лежат в разных пакетах конфликтов не будет, просто при использовании указывается полный путь. А как это организовать в случае прокта с++? Раскидать .h-файлы по разным физ. каталогам ("пакетам", сейчас у меня так сделано), а куда тогда ложить cpp-файлы, чтобы не путаться потом? Как вообще в с++ принято организовывать подобную структуру хранения? Название: Re: Область видимости Отправлено: niXman от Март 19, 2010, 21:05 а про extern все забыли? ;)
Название: Re: Область видимости Отправлено: lit-uriy от Март 19, 2010, 21:59 >>а про extern все забыли?
я забыл как про страшный сон, перейдя на С++ Название: Re: Область видимости Отправлено: lit-uriy от Март 19, 2010, 22:02 serg_hd, Си и Си++, не модульные языки программирования. не существует понятия модуля (как, например, в python, про яву я не вкурсе), как единицы компиляции
Ты должен понять простую вещь: директива препроцессора include, должна тобой восприниматься буквально. Т.е. вместо неё будет помещено всё содержимое указанного файла. Компиляции, обычно, подвергаются только файлы с/cpp, из них получаются объектные файлы, затем линкер их соединяет, по одинаковым идентификаторам (именам функций, переменных, классов). Поэтому не должно быть два одинаковых имени выражающих разные вещи. Это дерьмовая идея, но это так. И исходя из того как работает include посмотри? какие файлы в итоге получаются, для случая: 1) используется разделение на h и cpp. 2) в твоём исходном варианте. Название: Re: Область видимости Отправлено: Igors от Март 19, 2010, 22:18 т.е. другого варианта кроме как использовать классику нет? Общий принцип - переменная должна быть описана до того как используется. Если у Вас 2 класса - и оба хотят знать друг о друге все (прямо здесь, в описании) - ходов нет, это нормально/естественно. Вообще лепить в хедер содержательные ф-ции - не гуд (если это не template). Использование extern в данном случае никак не поможет, тип все равно нужен. Хорошо, тогда другой вопрос. Допустим в проекте у меня 50 файлов (на данный момент именно .h-файлов и 1, главный .cpp). Мне их надо раскидать "по тематике". В яве это, например, пакеты. Т.е. в проекте может быть несколько файлов с одинаковыми названиями, но за счёт того, что они лежат в разных пакетах конфликтов не будет, просто при использовании указывается полный путь. А как это организовать в случае прокта с++? Раскидать .h-файлы по разным физ. каталогам ("пакетам", сейчас у меня так сделано), а куда тогда ложить cpp-файлы, чтобы не путаться потом? Как вообще в с++ принято организовывать подобную структуру хранения? Я работаю в IDE, часто организация файлов в проекте - просто копия файловой структуры. Все же файлов с одинаковыми именами лучше (практичнее) избегать. Компилятор ищет h файлы их в Include Paths и будет найден только первый. Чтобы не запутаться нужно писать типа #include "./Package1/matrix.h"Название: Re: Область видимости Отправлено: serg_hd от Март 21, 2010, 13:36 всё понял, всем спасиб
|