Почему операторы подкласса должны дублироваться?

Относительно новый для 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;

0

Решение

using directive а также using declaration действительны только для текущей единицы перевода. Вы можете поместить их в заголовочный файл, что не является хорошей практикой.

1

Другие решения

Основная причина в том, что компилятор смотрит только на один .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 вместе больше за счет того, что они содержат дубликаты определений для сущностей кода, подпадающих под одно правило определения. То есть функции.

1

По вопросам рекламы [email protected]