C 对象组成,注入和复制构造函数

C++ Object Composition, Depdendency Injection and Copy Constructors

本文关键字:复制 构造函数 注入 对象      更新时间:2023-10-16

我想在C 中设计一个称为实体的类。该实体具有指向Vector3D成员的指针,这是实体在3D空间中的位置。构造函数允许将Vector3D类型的指针传递给构造函数,以便将Vector3D实例实例化。

由于有一个动态分配对象的指针,因此必须将复制构造函数和分配运算符重载以深层复制向量。但是,由于可以在构造函数中传递向量,因此也可以在其他地方使用它,因此不能在灾难中删除。但是,如果通过复制构造函数创建的新实体或使用=运算符分配的新实体,则实体类必须删除向量的实例,因为它是在实体类中实例化的。

解决此类问题的最佳方法是什么?

#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

最好的方法是不要使用指向Vector3D的指针,而是按值使用。如果Vector3D是我怀疑的(围绕3个浮子或整数围绕的包装器),则分享它没有太多好处绩效。

您还可以开始对所有权进行更多的推论,但是在客户端代码上销毁Vector3D的负担(构造Entity的代码)。

如果这不是选项,则可以使用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_;
};

这是一个完美的示例,说明了新的C 11智能指针。如果假定客户端代码与Entity共享所有权,并且可能比Entity的寿命更长,则使用std::shared_ptr

如果您明确想将所有权转移到Entity,即客户码在将其包装到Entity之后不再使用矢量,则使用std::unique_ptr

如果客户端代码应该保留为唯一的所有者,从而决定何时删除向量,则使用std::weak_ptr

请参阅例如http://en.cppreference.com/w/cpp/memory,以获取更详细的描述。