2016-11-25 8 views
-1

私はベクトル間の演算を行う必要があるプロジェクトを開始しています。 それは学校のプロジェクトなので、私はすべてを自分で行う必要があります。 私はこの種の構造を持っています。ベクトルでのvector3d(x、y、z)演算を処理する最も良い方法

typedef struct  s_vector 
{ 
    float   x; 
    float   y; 
    float   z; 
}     t_vector; 

ここで、このt_vector間の操作を可能にしたいと考えています。私は私の最初の(そして唯一の)アイデアは、このような関数に対処することです。もちろん

t_vector  *addv(t_vector *a, t_vector *b); // do a += b. 

私の涅槃は、C++のように「オーバーロード演算子」のようなものですが、私は、これは存在しません知っていますc。

あなたにとって、このような操作をcで処理するにはどうすればよいでしょうか?

+0

あなたの最初のアイデアは私にとってはうれしいです。今度は 'addv'関数を実装します(〜4行のコード)。 –

+0

第3引数を渡して、必要な操作を指定することもできますが、bigint devからは、オペレーションの中には1つのオペランド(例:clear)しか必要ないため、それぞれのオペレーションに対して別々の関数を提供する方が良いことがわかります。両方のオペランドを保持する必要がある場合には、オペランドの1つと同じである可能性があるので、宛先引数を指定する方が良いことがわかります。 –

+0

私は何のエラーもなく、もっと良い方法があるかどうかを知りたかっただけです。この種の実装では、コードが本当に読みにくいので、おかげさまで –

答えて

2

C、C++とは異なり、すべて透明性に関するものです。あなたはいつ何が起こっているかを知っています。このように、オペレータに間違ったことをするためのオーバーロードはサポートされておらず、その種のコードは欲求不満である。したがって、あなたが望むことをするための名前付き関数を作成する必要があります。

しかし、C++では、add演算子を定数オブジェクトとして扱う可能性があります。おそらくCでもそうするべきです。もちろん

// C++ 
class Vector { 
    public: 
     Vector functionA(SomeType argument); 
     Vector functionB(Vector argument)const; 
     const Vector functionC(const Vector argument); 
}; 

// C 
t_vector *t_vector_functionA(t_vector *this, SomeType *argument); 
t_vector *t_vector_functionB(const t_vector *this, t_vector *argument); 
const t_vector *t_vector_functionC(t_vector *this, const t_vector argument); 

をあなたはこのポインタを必要としない場合: - スタイルクラスのオペレーター、次のように一般的に

t_vector t_vector_add(const t_vector *a, const t_vector *b); 

を私はC++に変換したい:そのように私はお勧めしたい

、それを必要とせず、好きな命名方式を使うことができます。

関連する問題