首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++对象组合、依赖注入和复制构造函数

C++对象组合、依赖注入和复制构造函数
EN

Stack Overflow用户
提问于 2014-01-29 17:52:41
回答 2查看 462关注 0票数 0

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

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

代码语言:javascript
复制
#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
EN

回答 2

Stack Overflow用户

发布于 2014-01-29 17:55:08

最好的方法是不使用指向Vector3D的指针,而是通过值获取它。如果Vector3D是我所怀疑的(一个大约3个浮点数或整数的包装器),那么共享它对性能并没有多大好处。

您还可以开始更多地考虑所有权以及在客户机代码(构造Entity的代码)上销毁Vector3D的负担。

如果这不是一个选项,您可以使用std::shared_ptr

代码语言:javascript
复制
#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_;
};
票数 3
EN

Stack Overflow用户

发布于 2014-01-29 18:04:00

这是一个在哪里使用新的C++11智能指针的完美例子。如果假定客户端代码与Entity共享所有权,并且可能比Entity的生命周期使用更长的时间,则可以使用std::shared_ptr

如果客户端代码应该仍然是唯一的所有者,并因此决定何时删除向量,则可以使用std::weak_ptr

有关它们的更详细的描述,请参见例如http://en.cppreference.com/w/cpp/memory

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21427434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档