gpt4 book ai didi

c++ - 在具有所有 const 数据成员的类中实现复制赋值运算符是否有意义?

转载 作者:搜寻专家 更新时间:2023-10-30 23:49:46 25 4
gpt4 key购买 nike

假设我有一个类用于表示一些微不足道的数值数据,例如 vector 。我希望此类在其成员方面是不可变的,但仍支持正确的复制分配行为。

这个类的外壳可能是这样的:

class Vector {
public:
Vector(float _x, float _y);

private:
const float x;
const float y;
};

我希望能够为(例如)一个类中的 vector 成员分配一个新值。具有位置的屏幕实体,可能使用 Vector 类型的非常量成员表示。

这个“实体”本身必须是可变的(可能支持移动),例如用于存储其位置的内部 Vector 成员必须更改。与其直接修改该成员,不如将其替换为一个全新的 Vector 实例,并使用修改后的值进行初始化。

在 C# 等语言中,我会根据当前 Vector 实例简单地计算 X 和 Y 的新值,并将使用这些值初始化的新 Vector 对象分配给成员,丢弃以前的值并让 GC 完成剩下的工作。

// Inside some class (C#/Java type)...
Vector position;
...
// Example function:
void Move(float _dX, float _dY) {
this.position = new Vector(_dX + position.X, _dY + position.Y);
}

这就是我有限的 C++ 能力发挥作用的地方,因为我不确定如何以这样一种方式实现 operator=,即动态内存中包含的这种不可变类型的实例不会简单地 '消失”并导致泄漏。

所以,我想,我想问的是:

Vector& operator=(const Vector& _rhs);
...
// In implementation file...
Vector& Vector::operator=(const Vector& _rhs) {
// WHAT ON EARTH GOES IN HERE?!?!?
}

Vector 案例是我为了表达我的观点而发明的,我可以想到在成员级别应该不可变的多种类型。

我是否在浪费时间尝试为不可变类型建模?

有没有更好的解决方案?

最佳答案

当你输入时

Vector position;

在类定义中,您定义了一个 Vector 类的实例,它将永远留在这里。如果那个是不可变的,那你就完蛋了。

在 C#/Java 中,没有办法做到这一点。相反,您定义引用。

如果你想在 C++ 中做同样的事情,你需要指针或 auto_pointers

Vector* position;

这样,您可以更改 position 指向的实例。

您不应该定义不可变类的赋值运算符。如果您真的需要,也许您应该使 Vector 可变,并在需要不可变的 Vector 时使用 const Vector。您只需将 const 限定符添加到允许使用 const Vector 的方法。

例如:

class Vector {
private:
float x;
float y;
public:
// allowed for const Vector
// because of the const before the '{'
float norm() const {
return hypot(x,y);
}

Vector& operator=(const Vector& o) {
x=o.x;
y=o.y;
return *this;
}
};

关于c++ - 在具有所有 const 数据成员的类中实现复制赋值运算符是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3658854/

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