Russian Qt Forum

Qt => Общие вопросы => Тема начата: xintrea от Декабрь 06, 2015, 21:53



Название: Почему компилятор не видит заинклюденный класс?
Отправлено: xintrea от Декабрь 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 (https://github.com/xintrea/mytetra_dev/commits/editorModification)

Коммит:

Код:
fc543909e727ee9dd4bccbeaa856512fbfae8f58


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

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


Название: Re: Почему компилятор не видит заинклюденный класс?
Отправлено: Old от Декабрь 06, 2015, 22:03
Насколько я вижу, у вас циклическое включение.
Форматер включает редактор, а редактор включает форматер.


Название: Re: Почему компилятор не видит заинклюденный класс?
Отправлено: Old от Декабрь 06, 2015, 22:07
Уберите из Editor include с formatters.h, он там не нужен.


Название: Re: Почему компилятор не видит заинклюденный класс?
Отправлено: xintrea от Декабрь 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


Название: Re: Почему компилятор не видит заинклюденный класс?
Отправлено: panAlexey от Декабрь 07, 2015, 00:03
Не уверен, что именно такая ошибка у меня была, но нечто подобное.
Сделал один xxxxx.h куда включил все классы и инклюдил его, а не заголовки нужных классов.
Ошибка ушла. Теперь всегда так и делаю.


Название: Re: Почему компилятор не видит заинклюденный класс?
Отправлено: xintrea от Декабрь 07, 2015, 01:11
Не уверен, что именно такая ошибка у меня была, но нечто подобное.
Сделал один xxxxx.h куда включил все классы и инклюдил его, а не заголовки нужных классов.
Ошибка ушла. Теперь всегда так и делаю.

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


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


Название: Re: Почему компилятор не видит заинклюденный класс?
Отправлено: Archan_gel от Декабрь 07, 2015, 15:57
Добавь в .h файлы
class Editor;
....

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


Название: Re: Почему компилятор не видит заинклюденный класс?
Отправлено: panAlexey от Декабрь 22, 2015, 16:32
Не уверен, что именно такая ошибка у меня была, но нечто подобное.
Сделал один xxxxx.h куда включил все классы и инклюдил его, а не заголовки нужных классов.
Ошибка ушла. Теперь всегда так и делаю.

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


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

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