我想在C++中设计一个名为Entity的类。该实体具有指向Vector3D成员的指针,该成员是该实体在3D空间中的位置。构造函数允许将Vector3D类型的指针传递给构造函数,以便在类的外部实例化Vector3D实例。
由于存在指向动态分配的对象的指针,因此必须重载复制构造函数和赋值运算符才能深入复制向量。但是,因为向量可以在构造函数中传递,所以它也可以在其他地方使用,因此不能在析构函数中删除。但是,如果新实体是通过复制构造函数创建的或使用=运算符分配的,则Entity类必须删除vector的实例,因为它是在entity类中实例化的。
#ifndef ENTITY_H
#define ENTITY_H
#include "Vector3D.h"
class Entity {
public:
Entity(Vector3D*);
Entity(const Entity&);
~Entity();
Entity& operator = (const Entity&);
protected:
Vector3D* vector;
};
#endif发布于 2014-01-29 17:55:08
最好的方法是不使用指向Vector3D的指针,而是通过值获取它。如果Vector3D是我所怀疑的(一个大约3个浮点数或整数的包装器),那么共享它对性能并没有多大好处。
您还可以开始更多地考虑所有权以及在客户机代码(构造Entity的代码)上销毁Vector3D的负担。
如果这不是一个选项,您可以使用std::shared_ptr。
#include <memory>
struct Vector3D {};
struct Entity {
// Construct from another shared_ptr.
Entity(std::shared_ptr<Vector3D> v) : v_(v) {}
// Assume ownership of `v`.
Entity(Vector3D* v) : v_(v) {}
// depending on which guarantees we have for sharing the vector
// we can omit checks for null.
const Vector3D& vector() const { return v_.get(); }
Vector3D& vector() { return v_.get(); }
private:
std::shared_ptr<Vector3D> v_;
};发布于 2014-01-29 18:04:00
这是一个在哪里使用新的C++11智能指针的完美例子。如果假定客户端代码与Entity共享所有权,并且可能比Entity的生命周期使用更长的时间,则可以使用std::shared_ptr。
如果客户端代码应该仍然是唯一的所有者,并因此决定何时删除向量,则可以使用std::weak_ptr。
有关它们的更详细的描述,请参见例如http://en.cppreference.com/w/cpp/memory。
https://stackoverflow.com/questions/21427434
复制相似问题