2013-06-06 2 views
0

Мне сложно определить, как классы определены в Qt.Метод Qt возвращает объект без полного определения объекта

Возьму API QT5 JSON в качестве примера:

QJsonValue класс, представляющий любое значение в формате JSON. Он может быть преобразован в QJsonObject, QJsonArray, или стандартных типов, таких как QString, междунар и т.д.

Теперь заголовок QJsonValue выглядит следующим образом (я раздели, не соответствующие части, полный файл here):

#include <QtCore/qglobal.h> 
#include <QtCore/qstring.h> 

class QDebug; 
class QVariant; 
class QJsonArray; 
class QJsonObject; // class is pre-declared 

class Q_CORE_EXPORT QJsonValue 
{ 
    QJsonValue(const QJsonObject &o); 
    QJsonObject toObject() const; // how does this work without 
            // any info on QJsonObject class structure?? 
    // ... 
} 

что меня беспокоит, что QJsonObject предварительно объявлено как существующий класс, но я полагаю, что без какой-либо информации о колбах класса, метод toObject() не будет компилировать (хотя это творит, в том числе только <QJsonValue> не прерывается).

Я не уверен в ссылке на const, поскольку это может не потребоваться полное описание класса, а только адрес.

Проблема в том, что в любом месте файла не содержится QJsonObject.h.

Это волшебство или что?

+2

Он включен в файл qjasonvalue.cpp. – thuga

+0

Как компилятор знает только с файлом заголовка, сколько места для сохранения этого объекта QJsonObject в стеке? * Без какой-либо информации об этом ?? * В C, если вы ссылаетесь на структуру, не определяя ее целостность, она терпит неудачу, я прав? – Gui13

+2

См. Http://stackoverflow.com/a/553796/492336 – sashoalm

ответ

2

Включить заголовок необходимо, только если вы определяете функции, но декларации функций (даже те, которые принимают параметры типа по значению) требуют только прямого объявления.

+0

Из комментариев к вопросу и этого ответа кажется, что C++ сделал еще один шаг, позволив программисту использовать наименьшее количество заголовков. Я не знал, что можно вернуть полностью раздутые объекты без полного определения структуры этого объекта. Я думаю, что компилятор должен понять это во время компиляции. – Gui13

+1

@xgbi: Декларация просто означает «есть X». Определение означает «вот X». Компилятору действительно не нужно много делать для деклараций. В лучшем случае он добавляет в уведомление «эй, я использовал X» для компоновщика, чтобы его исправить. – MSalters