假设我们有一些类之间存在联系。作为示例,几何或数学库具有Vector3,Matrix4,Plane3..etc。它们之间有许多相交测试方法。例如,测试Plane3和Vector3之间的交集;如果Vector3(作为点)在平面上,背离平面和背离平面...等。

因此,交集测试方法可以同时在Vector3和Plane3类上编写。但这会导致小麻烦并重复硬编码。那么对于这种情况有什么建议吗?

  • 在具有更多含义的一类上实现该方法,尤其是在Plane3上,因为它更多地用于路口,其目的是路口测试和此类事物。
  • 在两个类上实现。
  • 在实用程序类中作为静态方法实现。
  • 其他

  • 第一种情况可能很好,但有时情况并不像上面所说的那样明确。第二个要求专门针对具有许多方法的许多类的更多重复代码,这导致代码的笛卡尔乘法增加。第三类可以很好,但是有时它不能访问类的私有(private)方法或 protected 方法(如果不是作为 friend 实现的),而且我通常不知道如何对实用程序类进行分类,并且让用户更难知道他的方法在哪里。 /她正在寻找。那么这种情况有什么办法吗?

    编辑:更详细的示例。
    class A {}
    class B {}
    class C {}
    

    第一:
    bool A::IsIntersecting(const B& b) const;
    bool A::IsIntersecting(const C& c) const;
    bool B::IsIntersecting(const C& c) const;
    

    第二:
    bool A::IsIntersecting(const B& b) const;
    bool A::IsIntersecting(const C& c) const;
    bool B::IsIntersecting(const A& a) const;
    bool B::IsIntersecting(const C& c) const;
    bool C::IsIntersecting(const A& a) const;
    bool C::IsIntersecting(const B& b) const;
    

    第三:
    bool IntersectUtility::IsIntersecting(const A &a, const B &b);
    bool IntersectUtility::IsIntersecting(const A &a, const C &c);
    bool IntersectUtility::IsIntersecting(const B &b, const C &c);
    

    最佳答案

    Implement the method on one class which has more meaning to has it, specically on Plane3 because it is used more for intersections, its aim is, intersection test and this kind of things.
    

    由于多种原因,此解决方案使我“闻起来”。我看到的最大问题是,当消费者试图弄清楚特定几何对象对的intersectionTest函数的位置时,这将非常令人困惑。例如,它是Line还是Point?如何测试Line是否与Plane相交呢?我看到一种选择任意规则的诱惑,例如高维对象包含与低维对象相对应的函数,但是当您测试相同维的对象(例如多维数据集和对象)时,就会遇到相同的问题圈。
    Implement on both classes.
    

    这是太多重复的代码。但是,您可能可以为1D,2D,3D等创建基本的实现,从而完成大部分工作。显然,这将利用继承,您说过您不想这样做。
    Implement in a utility class as a static method.
    

    没有明显解决方案的原因是这些对象的两个(或更多,看起来好像不想考虑)的交集实际上并不属于它们中的任何一个。它属于他们所在的“空间”。所以我的建议是,少考虑一个对象与另一个对象相交的问题,而是根据它们在“space” 中的位置构建一个解决方案,无论是一维空间,二维空间,等等。归根结底,到底是将其实现为裸函数还是静态函数,基类还是保存对象的容器都取决于您。

    关于c++ - 类的关系:需要建筑建议,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26385688/

    10-10 10:53