(я предполагаю, что то, что вы разместили выше, на самом деле является фрагментом из какого-то заголовочного файла.)
Подобные вещи обычно случаются, когда разные исходные файлы в вашей программе компилируются с различными настройками, связанными с макетом памяти, такими как параметры упаковки классов и выравнивания. Ваш заголовочный файл включен в эти разные единицы перевода и интерпретируется по-разному из-за расхождений в настройках макета памяти.
Как только вы начнете передавать Test
объекты между этими единицами перевода, проблема обнаружится. Один модуль перевода создает объект Test
с одним макетом памяти, затем другой модуль перевода читает его или записывает в него, предполагая совершенно другую структуру памяти. В вашем случае именно ваши встроенные функции интерпретируются по-разному в каждой единице перевода.
Если вы определите свои функции-члены как не встроенные, они примут макет памяти класса, специфичный для исходного файла, в котором они определены. Это сместит проблему под ковер и заставит все «работать» (поскольку функции доступа теперь привязаны к одному макету памяти), но, тем не менее, это не очень хорошая ситуация. Это все еще может привести к различным проблемам подобного характера в будущем.
Убедитесь, что все исходные файлы в вашей программе скомпилированы с точно такими же настройками макета памяти классов.
PS Как отметил Фред в комментариях, расхождение в разметке памяти классов между единицами перевода может быть вызвано чем-то столь прозаичным, как забывание перекомпилировать исходный файл после изменения заголовочного файла, от которого зависит исходный файл на.
Другим «популярным» источником таких проблем являются определения классов, которые зависят от директив препроцессора (то есть макет класса «настраивается» сегментами #ifdef
/ #endif
). Если вы забудете #define
что-то важное в каком-то исходном файле, который включает в себя ваш заголовочный файл, вы можете получить другую схему памяти для класса в этом исходном файле.