代码之家  ›  专栏  ›  技术社区  ›  Involute

解决明显的循环依赖关系:类A有一个接受类B的方法,而类B有一个类型为类A[重复]的成员

  •  0
  • Involute  · 技术社区  · 2 年前

    我想定义两个类, 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 作为指针,并将其存储为成员。)

    1 回复  |  直到 2 年前
        1
  •  2
  •   lorro    2 年前

    class Position 仅引用 class TangentVector . 因此,您可以预先声明 TangentVector class TangentVector; 在声明之前 班级职位 :

    class 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;
    };