Russian Qt Forum
Ноябрь 23, 2024, 13:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Почему компилятор не видит заинклюденный класс?  (Прочитано 5767 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Декабрь 06, 2015, 21:53 »

Есть вот такой простой класс:
Код
C++ (Qt)
define FORMATTER_H
 
#include <QObject>
 
#include "../Editor.h"
#include "../EditorConfig.h"
#include "../EditorTextArea.h"
 
class Formatter : public QObject
{
 Q_OBJECT
public:
 explicit Formatter(QObject *parent = 0);
 
 void setEditor(Editor *iEditor); // <-- Error !
 void setTextArea(EditorTextArea *iTextArea);
 
private:
 
 Editor editor;                   // <-- Error !
 EditorConfig *editorConfig;
 
 EditorTextArea *textArea;
 
};
 
#endif // FORMATTER_H
 

При его компиляции вылезают ошибки, что неизвестен класс Editor. Но я же его инклюдю, чего еще надо то? Ошибки следующие:
Код:
In file included from ../mytetra/src/libraries/wyedit/Editor.h:19:0,
                 from ../mytetra/src/views/record/MetaEditor.h:8,
                 from ../mytetra/src/views/recordTable/RecordTableScreen.cpp:12:
../mytetra/src/libraries/wyedit/formatters/Formatter.h:22:18: error: 'Editor' has not been declared
   void setEditor(Editor *iEditor);
                  ^
../mytetra/src/libraries/wyedit/formatters/Formatter.h:27:3: error: 'Editor' does not name a type
   Editor editor;
   ^

Пробовал не инклюдить, а прописывать предварительное описание класса через служебное слово class. А инклюд размещал не в заголовке, а в реализации. Проблема все равно остается.

Репозитарий:

https://github.com/xintrea/mytetra_dev/commits/editorModification

Коммит:

Код:
fc543909e727ee9dd4bccbeaa856512fbfae8f58


Как избавиться от этой ошибки?

ЗЫЖ После исправления, там скорее всего будут другие ошибки, потому что много чего переделал относительно предыдущего коммита. Но мне бы избавиться от той что в топике.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Декабрь 06, 2015, 22:03 »

Насколько я вижу, у вас циклическое включение.
Форматер включает редактор, а редактор включает форматер.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Декабрь 06, 2015, 22:07 »

Уберите из Editor include с formatters.h, он там не нужен.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #3 : Декабрь 06, 2015, 23:41 »

Вообще то нужен. В Editor будут создаваться экземпляры классов-форматтеров. Это еще не дописано, просто мне сейчас бы добиться компиляции.

Я уже нашел ошибку - у меня прописано "Editor editor;", а надо же было указатель: "Editor *editor;".

Но теперь залипуха с friend- классами. Я не могу их объявлять через предварительное объявление. Приходится их инклюдить. И вылезает такая ошибка:

Код:
../mytetra/src/libraries/wyedit/formatters/TypefaceFormatter.cpp
In file included from ../mytetra/src/libraries/wyedit/formatters/../Editor.h:20:0,
                 from ../mytetra/src/libraries/wyedit/formatters/Formatter.h:6,
                 from ../mytetra/src/libraries/wyedit/formatters/TypefaceFormatter.h:4,
                 from ../mytetra/src/libraries/wyedit/formatters/TypefaceFormatter.cpp:6:
../mytetra/src/libraries/wyedit/formatters/../formatters/PlacementFormatter.h:8:1: error: expected class-name before '{' token
 {
 ^
Makefile:24124: recipe for target 'build/TypefaceFormatter.o' failed

Коммит:

Код:
0cc340434af62d2612f61439dcbd4da248cca005
Записан

Собираю информацию по крупицам
http://webhamster.ru
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #4 : Декабрь 07, 2015, 00:03 »

Не уверен, что именно такая ошибка у меня была, но нечто подобное.
Сделал один xxxxx.h куда включил все классы и инклюдил его, а не заголовки нужных классов.
Ошибка ушла. Теперь всегда так и делаю.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #5 : Декабрь 07, 2015, 01:11 »

Не уверен, что именно такая ошибка у меня была, но нечто подобное.
Сделал один xxxxx.h куда включил все классы и инклюдил его, а не заголовки нужных классов.
Ошибка ушла. Теперь всегда так и делаю.

По-моему, это неправильно. Если объект большой, то компиляция будет реально медленной с таким подходом. Я уже это проходил. Теперь в заголовочных файлах стараюсь вообще не использовать инклюд, а только предварительные объявления классов. Иначе упаришься ждать завершения компиляции и линковки.


Блин, я так и не осилил последнюю ошибку.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Archan_gel
Гость
« Ответ #6 : Декабрь 07, 2015, 15:57 »

Добавь в .h файлы
class Editor;
....

а в .cpp файлы заинклудь.
и так же по анологи сделай в реализации Editor
class Formatter; и т.д.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #7 : Декабрь 22, 2015, 16:32 »

Не уверен, что именно такая ошибка у меня была, но нечто подобное.
Сделал один xxxxx.h куда включил все классы и инклюдил его, а не заголовки нужных классов.
Ошибка ушла. Теперь всегда так и делаю.

По-моему, это неправильно. Если объект большой, то компиляция будет реально медленной с таким подходом. Я уже это проходил. Теперь в заголовочных файлах стараюсь вообще не использовать инклюд, а только предварительные объявления классов. Иначе упаришься ждать завершения компиляции и линковки.


Блин, я так и не осилил последнюю ошибку.

я и говорил о предварительном описании классов.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.184 секунд. Запросов: 23.