gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:08:56 27 4
gpt4 key购买 nike

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

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

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

#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 个 float 或整数的包装器),那么共享它在性能方面并没有太大好处。

您还可以开始更多地考虑所有权以及销毁客户端代码(构造 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_;
};

关于C++ 对象组合、依赖注入(inject)和复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21427434/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com