Поскольку это неправильно понято, я должен уточнить. Все следующие решения не требуют перекомпиляции объекта. Чтобы использовать класс в вашем коде, если он скомпилирован в объектный файл, вы должны включить файл заголовка с объявлением этого класса.
#include <class.h>
ObjectFoo instance;
возможно (но опасно, если вы не будете осторожны) изменить заголовок (a) или скопировать заголовок в другое место и включить этот заголовок (b), без перекомпиляции самого класса < / сильный>.
#include <class_fixed.h>
ObjectFoo instance;
Ваш код, в который вы включили новый заголовок, будет просто думать, что в объектном файле (который вы не перекомпилировали!) Он найдет реализацию класса, объявленного как в class_fixed.h
. Пока сохраняется класс, объявленный как в class.h
. Если вы измените смещения элементов (например, добавите новые элементы) в своем новом заголовке, вы мертвы, и код не будет работать должным образом. Но просто изменение доступа работает нормально. Скомпилированный код не знает о доступе, это имеет значение только при компиляции странно.
Это не всегда вредно. В повседневной жизни вы сталкиваетесь с таким изменением, когда устанавливаете новую версию библиотеки в свою систему и не перекомпилируете все программы, которые от нее зависят. Но с этим нужно обращаться осторожно
Есть несколько решений.
memcpy()
Не надо! Не используйте memcpy, поскольку копирование объектов иногда подчиняется определенной политике, наложенной разработчиком класса. Например, auto_ptr
s нельзя просто скопировать в память: если вы скопируете в память auto_ptr
, а затем деструктор будет запущен для обоих, вы попытаетесь освободить одну и ту же память два раза, и программа выйдет из строя.
Измените private:
на public:
в заголовке или с помощью макроса
Если ваша лицензия позволяет, вы можете решить свою проблему, отредактировав файл заголовка, который поставляется с реализацией класса. Независимо от того, находится ли исходный код реализации (т.е. cpp-файл класса) под вашим контролем, не имеет значения: достаточно изменить частный на общедоступный для элементов данных (в заголовке) и отлично работает, даже если вам дан двоичный- единственная библиотека, содержащая определение класса. (Для функций-членов изменение доступа иногда меняет свое внутреннее имя, но для MSVS и GCC это нормально.)
Добавление новой функции-получателя
Хотя изменение private
на public
почти всегда нормально (если вы не полагаетесь на определенные проверки во время компиляции, которые должны прервать компиляцию, если у класса есть доступный определенный член), добавление новой функции-получателя следует выполнять осторожно. Функция-получатель должна быть встроенной (и, следовательно, определяться в файле заголовка класса).
reinterpret_cast
Приведение работает нормально, если вы НЕ приводите указатель к динамическому базовому классу (динамический означает «с виртуальными функциями или базами»), фактический экземпляр которого находится в момент литья может быть получен из класса в конкретном фрагменте кода.
protected:
И на всякий случай забыл. C ++ может объявлять элементы protected:
, т.е. доступные только для классов, производных от данного. Это может удовлетворить ваши потребности.
person
P Shved
schedule
03.10.2009
//private:
будет работать нормально;) - person LiraNuna   schedule 03.10.2009