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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с включением файлов  (Прочитано 8272 раз)
ruzik
Гость
« : Июль 14, 2012, 23:38 »

Здравствуйте, есть такой класс:

Код:
#ifndef RFILEDOWNLOADER_H
#define RFILEDOWNLOADER_H
//--------Qt Headers
#include <QObject>

class QString;
class QNetworkAccessManager;
class QNetworkReply;
class QUrl;
class QNetworkRequest;
//-------My and other headers
//-------
class RFileDownloader: public QObject
{
    Q_OBJECT
public:
    explicit RFileDownloader(QObject *parent);
    explicit RFileDownloader(const QUrl &url = QUrl(), QObject *parent = 0);
    ~RFileDownloader();
    //Url
    void setUrl(const QUrl &url) {_url = url;}
    QUrl url() const {return _url;}
private:
    QNetworkAccessManager _manager;
    QUrl _url;
public slots:
    void startDownloading(QUrl url = QUrl());
signals:
    void finished(QNetworkReply *reply);
};

#endif // RFILEDOWNLOADER_H
Как вы видите, вместо включения файлов имеем одни лишь объявления.
Файл RFileDownloader.h включается в rizekFaster.h и RIconManager.h, оба этих файла имеют такие строки:
Код:
#include <QString>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUrl>
#include <QNetworkRequest>
То есть содержать включения, но тем не менее я получаю такие ошибки:
Цитировать
In file included from Classes\RFileDownloader\RFileDownloader.cpp:3:
./Classes/RFileDownloader/RFileDownloader.h:24: error: field '_manager' has incomplete type
./Classes/RFileDownloader/RFileDownloader.h:25: error: field '_url' has incomplete type
./Classes/RFileDownloader/RFileDownloader.h:18: error: invalid use of incomplete type 'struct QUrl'
./Classes/RFileDownloader/RFileDownloader.h:9: error: forward declaration of 'struct QUrl'
./Classes/RFileDownloader/RFileDownloader.h:27: error: invalid use of incomplete type 'struct QUrl'
./Classes/RFileDownloader/RFileDownloader.h:9: error: forward declaration of 'struct QUrl'
./Classes/RFileDownloader/RFileDownloader.h: In member function 'void RFileDownloader::setUrl(const QUrl&)':
./Classes/RFileDownloader/RFileDownloader.h:21: error: '_url' was not declared in this scope
./Classes/RFileDownloader/RFileDownloader.h: In member function 'QUrl RFileDownloader::url() const':
./Classes/RFileDownloader/RFileDownloader.h:22: error: return type 'struct QUrl' is incomplete
./Classes/RFileDownloader/RFileDownloader.h:22: error: '_url' was not declared in this scope
Classes\RFileDownloader\RFileDownloader.cpp: In constructor 'RFileDownloader::RFileDownloader(const QUrl&, QObject*)':
Classes\RFileDownloader\RFileDownloader.cpp:13: error: '_url' was not declared in this scope
Classes\RFileDownloader\RFileDownloader.cpp: In member function 'void RFileDownloader::startDownloading(QUrl)':
Classes\RFileDownloader\RFileDownloader.cpp:20: error: 'url' has incomplete type
./Classes/RFileDownloader/RFileDownloader.h:9: error: forward declaration of 'struct QUrl'
Classes\RFileDownloader\RFileDownloader.cpp:24: error: '_url' was not declared in this scope
Classes\RFileDownloader\RFileDownloader.cpp:26: error: variable 'QNetworkRequest request' has initializer but incomplete type
Classes\RFileDownloader\RFileDownloader.cpp:26: error: '_url' was not declared in this scope
Classes\RFileDownloader\RFileDownloader.cpp:27: error: '_manager' was not declared in this scope
А если поставить в RFileDownloader.h обратно includ'ы то все компилируется хорошо
Почему так происходит?
Записан
mutineer
Гость
« Ответ #1 : Июль 14, 2012, 23:47 »

Потому что forward declaration можно использовать только если у тебя есть указатели на объекты, а не сами объекты.
Код:
private:
    QNetworkAccessManager _manager;
    QUrl _url;
вот тут компилятору надо знать размеры объектов классов QNetworkAccessManager и QUrl, но узнать он их не может, так как нету их описания, а есть только имена
« Последнее редактирование: Июль 14, 2012, 23:49 от mutineer » Записан
ruzik
Гость
« Ответ #2 : Июль 15, 2012, 10:45 »

Понятно, большое спасибо!
Записан
ruzik
Гость
« Ответ #3 : Июль 15, 2012, 19:25 »

И еще один вопрос по теме:
Если я использую ссылки в forward declaration, то с ними поступать как с указателями(объявление класса) или как с объектами(include)?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июль 15, 2012, 19:58 »

И еще один вопрос по теме:
Если я использую ссылки в forward declaration, то с ними поступать как с указателями(объявление класса) или как с объектами(include)?
Как с указателями
Записан
ruzik
Гость
« Ответ #5 : Июль 15, 2012, 20:01 »

Понятно, еще раз спасибо!
Записан
ruzik
Гость
« Ответ #6 : Июль 21, 2012, 15:28 »

И еще один вопрос напоследок, есть такой метод класса:
Код:
QIcon icon();
Нужно ли подключать #include <QIcon>, тк это не ссылка/указатель или нет, так как вроде бы компилятору не надо знать память которую требуется выделить ибо объекта не создается.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Июль 21, 2012, 18:23 »

а самому проверить не? возвращается же не ссылка и не указатель, значит нужно.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ruzik
Гость
« Ответ #8 : Июль 21, 2012, 18:39 »

Спасибо!
Извините за лишнюю назойливость, просто проверил в проекте - но мало ли вдруг QIcon включается где-то в инклудах которые сами включаются и я запомню как неправильно
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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