В каких случаях используется описанная в примере реализация объявление класса
Есть пример:
sink.h
#include <QSharedPointer>
// объявление класса без реализации (для того, чтобы не подключать заголовок settings.h)
class Settings;
class Sink
{
public:
// ...
void setSettings(Settings* settings) noexcept;
const Settings* settings() const noexcept;
// ...
private:
QSharedPointer<Settings> p_settings{ nullptr };
};
settings.h
class Settings
{
public:
// ...
bool isValid() const noexcept;
// ...
};
sink.cpp
#include "sink.h"
// Подключение нашего заголовка для определения интерфейса класса
#include "settings.h"
void Sink::setSettings(Settings* settings) noexcept
{
if (settings) {
if (settings->isValid()) {
p_settings.reset(settings);
}
}
}
Вопрос в том, в каких случаях можно объявить класс без его реализации (чтобы не подключать заголовок, как в нашем случае). Я правильно понимаю, что это возможно только тогда, когда этот класс является только частным и/или является указателем ?
Ответы (1 шт):
Автор решения: AlexGlebe
→ Ссылка
Архитектура важности, и порядка объявления кода :
- Тип объекта - предварительно
- Объявление статической переменной - предварительно
- Объявление статической функции - предварительно
- Структура объекта - фактическая
- Инлайн функции - определение
- Статические переменные - определение
- Статические функции - определение
Ответ на вопрос : когда хватает предварительное объявление класса.
Когда не важен его размер. Этот код компилируется.
class Settings ;
// предварительно можно всё
extern Settings variable ;
Settings function ( Settings ) ;
class C {
// только ссылку или указатель
Settings * s ;
// статическая переменная не хранится в объекте
static Settings ss ;
// предварительно можно по значению
Settings function ( Settings ) ;
} ;
// только ссылку или указатель
inline Settings & funci ( Settings * s ) {
return * s ; }
Settings * pointer ;
Settings * funcs ( Settings & s ) {
return & s ; }