Вы, кажется, путаете понятия исходного файла и включаемого файла.
Проще говоря, в C ++ у вас есть два типа файлов:
- Исходные файлы содержат исходный код. Это код, который будет выполнен в вашем приложении. Исходные файлы обычно имеют расширение .CPP.
- Включаемые файлы содержат объявления. Они только описывают элементы в вашем приложении, но не содержат исходного кода. Включаемые файлы обычно имеют расширение .H.
Исходные файлы могут включать включаемые файлы, а включаемые файлы могут включать другие включаемые файлы. Исходные файлы никогда не включаются в другие файлы. Они скомпилированы и связаны друг с другом.
В вашем случае включение «Extending.cpp» в form1.h явно неверно.
Попробуйте разделить ваш код на чистые включаемые файлы и исходные файлы. Это значит:
- FORM1.H, который содержит объявление класса, но не имеет исходного кода
- FORM1.CPP, который содержит код класса вашей формы
- EXTENDING.H, который содержит объявление класса, но без исходного кода
- EXTENDING.CPP, который содержит исходный код класса Extending
Вы заметите, что FORM1.H не будет нуждаться в EXTENDING.H и наоборот.
С другой стороны, FORM1.CPP может требовать как FORM1.H, так и EXTENDING.H, и, вероятно, EXTENDING.CPP может требовать и FORM1.H, и EXTENDING.H, но это не проблема.
Теперь скомпилируйте оба файла CPP и свяжите их вместе.
Как только вы приобретете больше опыта в C ++, вы увидите, что действительно возможно поместить исходный код во включаемые файлы (чтобы сделать возможной вставку) и иметь циклические зависимости (используя предварительные объявления), но сначала начните приобретать больше опыта в C ++ .
EDIT:
Если в Form1 есть что-то, что требует EXTENDING.H, это может быть один из следующих случаев:
- У вас есть встроенный метод, который требует определения класса Extending -> переместите метод в form1.cpp.
- У вас есть член в Form1, который является указателем на класс Extending -> использовать предварительные объявления (на самом деле компилятору не нужно знать полное определение класса, чтобы иметь возможность генерировать код для хранения указателя)
- У вас есть член в Form1, который является экземпляром Extending -> тогда вам действительно нужно включить EXTENDING.H в FORM1.H
- Ваш класс Form1 наследуется от Extending -> тогда вам действительно нужно включить EXTENDING.H в FORM1.H
- В Form1 существует тип данных, который требует определения чего-либо в Extending (может быть перечислением) -> тогда вам действительно нужно включить EXTENDING.H в FORM1.H
Проверьте то же самое для обратного.
Если у вас все еще есть циклическая зависимость, извлеките члены, которые вызывают зависимость, и поместите их в другой класс, который затем может использоваться как EXTENDING.H, так и FORM1.H.