Как компилятор и компоновщик обрабатывают классы и функции

Может ли кто-нибудь помочь мне понять, почему у меня может быть один и тот же класс в двух разных блоках компиляции без ошибок компоновщика, но не одна и та же функция в разных блоках компиляции?

Спасибо заранее.

0

Решение

Один и тот же класс в двух единицах компиляции, вероятно, приведет к некорректной программе из-за ошибок определения одного из ее методов (включая специальные члены, такие как ctor по умолчанию или оператор =), имеющих одно и то же имя.

Мои специальные функции-члены определены неявно встроенными, поэтому мы получаем плохо сформированные программы без необходимости диагностики.

Я испортил память из-за этого; два матричных класса с одинаковым именем и разным расположением памяти.

1

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

Обычно компоновщик в основном осведомлен о функциях и переменных (переменные, не являющиеся членами).

Информация, которую компоновщик хранит в отношении классов, обычно связана с реализацией наследования. Функции-члены переводятся в обычные функции с дополнительными неявными this параметр. Доступ к членам обычно просто смещение в this указатель.

Однако, если вы добавите наследование к своим классам или используете typeid или type_info, вы можете столкнуться со многими видами странного поведения.

1