Заявления типа
class SparseMatrix;
называются предварительными декларациями.Он сообщает компилятору, что «где-то» существует класс с таким именем.Это делает компилятор счастливым и прекрасно работает до тех пор, пока файл прямого объявления использует либо указатель, либо ссылку на класс прямой ссылки.Это потому, что, с точки зрения компилятора, указатели или ссылки занимают всего 4 байта независимо от содержимого класса.
В коде OP обе SparseMatrix
и RegMatrix
используются только как (const) ссылки, поэтомупредварительного объявления достаточно, чтобы оно заработало.
Однако, если файл прямого объявления выполняет то, что требует от компилятора знать его размер, например
void foo( SparseMatrix ); // note pass by value
, то компилятор будет жаловаться:)
В конкретной ситуации, создаваемой OP, я предпочитаю отказаться от общего #include
в целом и спроектировать интерфейс только на основе предварительных объявлений.Реализация (т.е. файлы .cpp) может включать оба заголовочных файла, но это не проблема.