2016-09-29 1 views
1

私は2次元の線を表すクラスLineを持っています。この行に2d点があるかどうかをチェックする機能があります。2行の交差のための関数の設計

class Line 
{ 
    private: 
     float a,b,c: //line coefficients 
    public: 
    bool checkPointOnLine(); 
    ..... 
} 

ここで、2行の交差点を見つける必要があります。

class Line 
{ 
    private: 
     float a,b,c: //line coefficients 
    public: 
    bool checkPointOnLine(); 
    Point getIntersectionPoint(const Line& line); 
    ..... 
} 

のようなクラスのラインに新しいメンバ関数を置くかが、この大規模な措置に非メンバ関数

Point getIntersectionPoint(const Line& l1,const Line& l2); 
+0

はこちらを参照してください。http://stackoverflow.com/questions/5989734/effective-c-item-23-prefer-メンバー以外のメンバーでないメンバー – Hayt

答えて

2

を使用することをお勧めしている場合、私は、好みの問題です思ったんだけど静的または非メンバ関数のアプローチは、対称性のために少し好ましい。 2つの通話

a.someFunction(b) 

b.someFunction(a) 

が常に同じ結果を返す

、対称機能

someFunction(a, b) 

は、より直感的です。

Pointを返す交差点が存在しない(平行線の場合)か、無限個の点(2つの同一線分の場合)が理想的でないためです。あなたは、たとえば、Pointのペアとその妥当性のいくつかの指標を返すほうが良いでしょう

enum LineIntersectionKind { 
    Valid 
, Empty 
, Infinite 
}; 

pair<Point,LineIntersectionKind> getIntersectionPoint(const Line& l1,const Line& l2); 
+0

私はあなたの答えに同意しますが、そのような場合には私はこの関数(ライン係数)のプライベートメンバーに持っていなければなりません。それら。それとも、静的な関数を置くのがベストでしょうか。 –

+0

@VladimirYanakiev友人関係を必要としないアプローチは、 'Line'クラスで関数を静的にすることです。すなわち' static Line :: getIntersectionPoint'です。 – dasblinkenlight