OK.Во-первых, вам не нужно здесь заранее что-либо объявлять, потому что нужная вам структура полностью объявлена в этом заголовочном файле.
Когда вы все равно попытаетесь это сделать, вы получите ошибку, возможно, потому чтокомпилятор думает, что вы объявляете новую версию CardState
, а затем он нигде не получает полного объявления.
Что вам нужно сделать, это удалить эту вторую (заглушку) разлупку для CardState
, а затемисправьте ошибку, из-за которой вы (по ошибке) вставили эту заглушку.
В комментариях вы говорите, что исходное сообщение об ошибке было что-то вроде «не удалось найти заголовок».Для меня это означает, что у вас, вероятно, нет каталога, содержащего Application.h
, в стандартной библиотеке поиска вашего компилятора.Вы можете добавить его с помощью директивы -I dirname
в командной строке, если хотите.Но, скорее всего, он находится в том же каталоге, что и ваш другой файл включения, и вы можете просто изменить оператор включения на следующий, и он будет найден:
#include "Application.h" // Note quotes instead of <>
Обновление : Лоран обновляет код примера и специально спрашивает в комментариях ниже об указателях.
Во-первых, даже в обновленном коде я не вижу причин, по которым требуется предварительное объявление.Просто переместите объявление CardState
в Session.h, и проблема исчезнет.Такое перемещение кода всегда должно быть вашим первым решением.Прямые ссылки действительно обязательны , если у вас есть взаимно ссылающиеся структуры.
Если у вас действительно есть взаимно ссылающиеся структуры, тогда да, вам нужно будет заполнить хотя бы одно из этих полейлибо указатель, либо ссылка.Это не совсем для компилятора, так как физически возможно реализовать структуру (и).Если A
физически содержит полную копию B
, а B
физически содержит полную копию A
, то ваша структура будет логически иметь бесконечный размер!