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