Я не вижу проблемы с повторным использованием одного и того же идентификатора в разных пространствах имен, для которого они были созданы.
Однако я настоятельно призываю вас НЕ «имитировать» включение math :: Rectangle. Если вам нужен файл, включите его, но то, что вы делаете, называется программированием копирования / вставки, и это приводит к большому количеству проблем, в основном потому, что ваши два фрагмента кода не синхронизированы, поэтому любое исправление ошибки / добавление функции к одному не сообщается о другом.
РЕДАКТИРОВАТЬ: ответ на редактирование;)
Из комментариев не ясно, поэтому я скажу:
Если вам нужна зависимость (потому что вы действительно ИСПОЛЬЗУЕТЕ предлагаемую функциональность), тогда вы ДОЛЖНЫ включить заголовок. С другой стороны, если вы используете наследование только для того, чтобы получить что-то с четырьмя углами и почти без методов, тогда вам лучше развернуть новый класс Rectangle с минимальной функциональностью.
Хотя я могу вспомнить крайний случай. У меня сложилось впечатление, что вас не столько интересует функциональность, сколько интересует возможность повторного использования методов в библиотеке Math, которые были адаптированы для использования в качестве параметра math :: Rectangle.
Согласно Хербу Саттеру (я думаю, что в стандартах кодирования C ++) свободные функции, которые связаны с классом, являются частью открытого интерфейса класса. Поэтому, если вы хотите эти классы, вам действительно нужно наследование.
Теперь я могу понять, что у вас может возникнуть нежелание включать библиотеку, которая может быть огромной (я не знаю вашу библиотеку по математике). В этом случае вы можете разделить библиотеку Math на две части:
- Библиотека MathShapes, содержащая основные формы и методы, которые воздействуют на них
- Math библиотека, которая включает MathShapes и добавляет все остальные вещи
Таким образом, вы зависите только от библиотеки MathShapes.
С другой стороны, если вы абсолютно не хотите зависимости, тогда подойдет тупое копирование / вставка, но ваше решение проверить наличие Math :: Rectangle путем проверки наличия его защиты заголовка плохо приспособлено :
- Это работает, только если вы правильно установили охрану заголовка
- И , если включение фактически выполняется ДО включение Graphics :: Rectangle
Обратите внимание, что в случае, когда Graphics :: Rectangle включен перед Math :: Rectangle, у вас могут возникнуть некоторые проблемы с компиляцией ...
Так что решайте, хотите ли вы зависимости.