Относительно новый для cpp. Когда вы создаете подкласс базового класса, каскад #include к подклассу, почему использование класса в файле cpp также не охватывает область действия подкласса? Это историческая или прагматическая причина? Эээ .. В чем причина?
//available to subclass
#include <cinder/app/appBasic.h>
// have to duplicate in subclass
using namespace ci;
using namespace ci::app;
using namespace std;
using directive
а также using declaration
действительны только для текущей единицы перевода. Вы можете поместить их в заголовочный файл, что не является хорошей практикой.
Основная причина в том, что компилятор смотрит только на один .cpp
файл плюс что бы то ни было #includes
, Понятия не имеет, что using
Заявления могут быть в .cpp
файл для вашего базового класса. В связи с этим, он понятия не имеет, написали ли вы .cpp
файл для базового класса еще при компиляции .cpp
файл для производного класса. И он не собирается копаться в файловой системе, в отличие от, например, javac
,
Кроме того, я думаю, вы пишете один .cpp
файл на класс, и присвоение файлу имени, которое имеет отношение к имени класса. Но C ++ этого не требует. Вы можете иметь более одного класса в файле, или, если хотите, вы можете разделить класс на несколько файлов.
Итак, вы знаете, что это .cpp
файл файл для вашего производного класса, и что другой .cpp
файл файл для базового класса, и поэтому вы думаете, что это может быть удобно, если некоторые вещи из другого .cpp
файл был поднят в этот .cpp
файл. Но компилятор не знает такой вещи. Компилятору C ++ не имеет смысла говорить о том, что находится в файл для базового класса.
Наконец, причина, которая является принципиальной, а не прагматичной: просто потому, что разработчику базового класса удобно переносить имена из определенных пространств имен в глобальную область видимости, не означает, что то же самое будет справедливо для разработчика производного класса. Производный класс может не использовать ci::app
вообще, не говоря уже о том, чтобы использовать его настолько, что человеку, пишущему производный класс, надоело его печатать. Так что даже если C ++ мог требует компилятор, чтобы получить те using
заявления (что, учитывая модель компиляции, не может), я уверен, что разработчики языка не захотят этого.
#include
каскад для подкласса
Нет, они не любой #include
в base.h
будет включен в derived.cpp
если (например) derived.cpp
включает в себя derived.h
который включает в себя base.h
, Но любой включает в base.cpp
не влияет на derived.cpp
,
Все это при условии, что вы следуете обычному соглашению об именах. Там нет ничего, кроме конвенции, чтобы остановить вас, включая .cpp
файл из derived.cpp
, в этом случае (1) любой включает или using
заявления будут применяться в derived.cpp
, но, к сожалению (2) вы, вероятно, сломаете свою систему сборки, потому что, скорее всего, вы не сможете связать base.o
а также derived.o
вместе больше за счет того, что они содержат дубликаты определений для сущностей кода, подпадающих под одно правило определения. То есть функции.