У меня есть производный класс, в котором есть член объединения, в котором хранятся два умных указателя. Однако, когда я пытаюсь скопировать-инициализировать некоторые экземпляры этого класса, компилятор сообщает об ошибке, которую я имею в виду для удаленной функции. Так что я думаю, это потому, что у него есть переменная объединения, и поэтому компилятор не может сгенерировать конструктор копирования по умолчанию для класса.
объявление класса:
struct EndpointInfo : public IntersectInfo {
EndpointInfo() {}
EndpointInfo(const EndpointInfo &other) : _emitter(other._emitter), {}
EndpointInfo(const std::shared_ptr<ProjectiveSensor> s, const Ray &ray) : IntersectInfo(ray._o), _sensor(s) {}
EndpointInfo(const std::shared_ptr<Emitter> e, const Ray &ray, const Vec3f &n_light) : IntersectInfo(ray._o), _emitter(e) {
_normal = n_light; // _normal is a member of base class.
}
~EndpointInfo() {}
union {
const std::shared_ptr<ProjectiveSensor> _sensor;
const std::shared_ptr<Emitter> _emitter;
};
};
В случае, если требуется объявление базового класса:
struct IntersectInfo {
Point3f _p;
Vec3f _wo;
float _t = INFINITY;
Vec3f _normal;
TransportMode _transport_mode;
std::shared_ptr<Primitive> _primitive;
std::shared_ptr<BSDF> _bsdf;
struct {
Vec3f _n;
Vec3f _tangent;
Vec3f _bitangent;
} _shading;
Vec3f _dpdu, _dpdv;
IntersectInfo() = default;
IntersectInfo(const IntersectInfo &origin);
IntersectInfo(const Point3f p);
};
Итак, из приведенного выше кода, базовый класс IntersectInfo
уже обладает конструктором копирования, и я думаю, что все, что меня волнует, это как скопировать объединение в конструкторе копирования EndpointInfo
,
Мой вопрос, после того как я прочитал эта тема, Я думал, смогу ли я использовать что-то вроде memcpy
, который не заботится о фактическом типе, но только о том, сколько памяти он копирует. И так как только std::shared_ptr
s в союзе, и независимо от того, какой из них, _sensor
или же _emitter
Я хочу скопировать (в том же объеме памяти), я просто скопировать кусок памяти. Если бы я мог, могу ли я использовать:
EndpointInfo(const EndpointInfo &other) : _emitter(other._emitter), {
// either
memcpy(&_sensor, &other._sensor, sizeof(_sensor));
// or
memcpy(&_emitter, &other._emitter, sizeof(_emitter));
// even
_sensor = other._sensor;
}
Если я не могу так использовать, есть ли другой способ, вместо того, чтобы явно использовать переменную для указания типа?
Задача ещё не решена.
Других решений пока нет …