C 对象组成,注入和复制构造函数
C++ Object Composition, Depdendency Injection and Copy Constructors
我想在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,以获取更详细的描述。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用