我想定义两个类,
Position
和
TangentVector
,部分给出如下:
class Position
{
public:
Position(double x, double y, double z);
// getters
double x(){ return m_x };
double y(){ return m_x };
double z(){ return m_x };
void translate(const TangentVector& tangent_vector);
private:
double m_x;
double m_y;
double m_z;
}
class TangentVector
{
public:
Tangent(double x, double y, double z, Position position);
// getters
double x(){ return m_x };
double y(){ return m_x };
double z(){ return m_x };
private:
double m_x;
double m_y;
double m_z;
Position m_position;
}
这些类需要注意的关键是
切向向量
具有类型为的成员
位置
(
切向向量
取决于
位置
)而
位置
具有接受类型为的参数的方法
const TangentVector&
(
位置
取决于
切向向量
?).
看在上下文的份上,
位置
用于表示单位球体上的点,以及
切向向量
描述与球体相切的向量,向量的原点由
位置
. 自定义
VectorTangent
需要
位置
具体来说,这样说似乎是合理的
矢量变换
取决于
位置
. 但是,现在我想定义一个函数
位置
在球体上,并沿球体“平移”它,方向和距离由
切向向量
. 我真的很喜欢这个
translate
居住方法
位置
类,因为它是一个修改
位置
. 这将有助于以下用法,我觉得这是很自然的:
Position position{ 1.0, 0.0, 0.0 };
TangentVector tangent_vector{ 0.0, PI/2, 0.0, position };
position.translate(tangent_vector); // Now { 0.0, 1.0, 0.0 };
然而,我担心这会导致某种循环依赖。所以
-
这种情况是循环依赖的一个例子吗?这种情况是坏习惯吗?
-
如果是这样,如何避免这种循环依赖?如何修改此代码,使其符合良好的OOP实践?
(我考虑过
Position m_position
改为成员一个原始指针。然而,在这种情况下,我打算
m_position
完全所有人
切向向量
,而不允许在类外部对其进行更改。在示例用法代码中,我不希望
翻译
要修改的方法
tangent_vector
,如果
tangent\u向量
的构造函数接收
position
作为指针,并将其存储为成员。)