gpt4 book ai didi

c++ - 是否存在用于对子类数据执行规则的设计模式?

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:38 25 4
gpt4 key购买 nike

假设一个类表示一个 3x3 矩阵,并在其构造函数中采用 9 个任意数字,并让该类具有一个 inverse() 方法。由于并非所有矩阵都是可逆的,因此 inverse() 方法返回一个可选值(或可为空的指针),调用者必须在运行时检查该值。

但是,某些 3x3 矩阵总是可逆的,只要矩阵中的值遵循特定规则,例如3D 旋转矩阵。我们可以用一个子类来编码它,它不允许直接构造,而是通过使用一些特殊规则构造的,例如绕笛卡尔轴的旋转角度。

最终结果是这个层次结构,它应该允许层次结构的客户端在使用子类时具有编译时安全性(例如,客户端保证 object.rotate(rotationMatrix.inverse()) 将始终工作,假设 rotationMatrix是 RotationMatrix 类型):

class Matrix {
public:
Matrix(double e_0_0, double e_0_1, double e_0_2,
double e_1_0, double e_1_1, double e_1_2,
double e_2_0, double e_2_1, double e_2_2) {
...
}

std::unique_ptr<Matrix3x3> inverse() const {
if (isInvertible) {
return std::unique_ptr(new Matrix3x3(...));
}

return std::unique_ptr();
}
}

class RotationMatrix : public Matrix3x3 {
public:
static RotationMatrix getRotationAroundX(double angle) {
return asRotationMatrix(Matrix(1, 0, 0,
0, cos(angle), -sin(angle),
0, sin(angle), cos(angle)));
}

RotationMatrix inverse() const {
return asRotationMatrix(*Matrix::inverse().get()));
}

private:
static const RotationMatrix3D& asRotationMatrix(const Matrix3x3& matrix) {
return static_cast<const RotationMatrix3D&>(matrix);
}
}

所以分解原来的问题:

  • 是否有除上述模式之外的其他模式来实现此功能?
  • 如果不存在其他模式,C++ 中是否有一种方法可以防止(或至少向 future 的开发人员明确发出信号)子类不得引入新的状态或构造函数以避免转换问题(例如切片等)?

最佳答案

在这里,您点击了 circle/ellipse problem :

最好区分类并使用组合:

class RotationMatrix {
public:

static RotationMatrix getRotationAroundX(double angle) {
return { Matrix(1, 0, 0,
0, cos(angle), -sin(angle),
0, sin(angle), cos(angle))};
}

RotationMatrix inverse() const {
return {*Matrix::inverse().get()});
}

const Matrix3x3& AsMatrix() const { return matrix; }

private:
static RotationMatrix(const Matrix3x3& matrix) : matrix(matrix) {}
Matrix3x3 matrix;
};

关于c++ - 是否存在用于对子类数据执行规则的设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38995182/

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