2009-07-31 12 views
4

私は、VectorMathクラスの静的メソッドを呼び出して計算を実行するVector3Dクラスを作成しています。私はコンパイルするとき、私はこれを取得:静的メソッドに関するC++リンカの問題

 
bash-3.1$ g++ VectorMath.cpp Vector3D.cpp 
/tmp/cc5cAPia.o: In function `main': 
Vector3D.cpp:(.text+0x4f7): undefined reference to 'VectorMath::norm(Vector3D*)' 
collect2: ld returned 1 exit status 

コード:

VectorMath.h:

#ifndef VECTOR3D_H 
#include "Vector3D.h" 
#endif 

class VectorMath { 
    public: 
    static Vector3D* calculatePerpendicularVector(Vector3D*, Vector3D*); 
    static Vector3D* norm(Vector3D*); 
    static double length(Vector3D*); 
}; 

VectorMath.cpp

#include "VectorMath.h" 
Vector3D* norm(Vector3D* vector) { // can't be found by linker 
    // do vector calculations 
    return new Vector3D(xHead, yHead, zHead, xTail, yTail, zTail); 
} 
// other methods 

のVector3D。 cpp

​​

なぜリンカがVectorMath::norm方法を見つけることができませんか?一見私は私はこのような規範を宣言する必要があるだろうと思うだろう:

Vector3D* VectorMath::norm(Vector3D* vector) { 

が、それはあなたがVectorMath.cppVector3D::normメソッドを定義していない...

+0

これは「どちらでも役に立たない」という情報は十分ではありません。どういう意味ですか?同じエラー、異なるエラー? – GManNickG

答えて

14

あなたはこの不足している:

//VectorMath.cpp 
#include "VectorMath.h" 

      | 
      V - here 
Vector3D* VectorMath::norm(Vector3D* vector) 
{ 
    ... 
} 

norm機能をVectorMath::の一部です。それがなければ、あなたはただ自由な機能しか持っていません。


これはデザインの詳細ですが、なぜすべてのものを指していますか?これははるかにクリーンです:

class VectorMath { 
    public: 
    static Vector3D norm(const Vector3D&); 
}; 

参考にしてください、あなたはC++だから、Cコードは書かないでください。私がこれを呼び出すとどうなりますか?

VectorMath::norm(0); // null 

それはどちらかクラッシュします、あなたは、その場合には、それが何を返す必要があり、チェックを入れする必要がありますか?これは参照を使用してすべてクリーンアップされます。

さらに、これらのメンバーをVector3Dクラスにするだけではどうですか?

Vector3D* v = new Vector3D(x, y, z); 
v->norm(); // normalize would be better, in my opinion 

最後に、スタック割り当てを行います。RAII概念これに

int main(void) { 
    Vector3D* v = new Vector3D(x, y, z); 
    Vector3D* normVector = VectorMath::norm(v); 

    // delete v; 
    //^you're not deleting it! 
}   

変更して、そして使用::

int main(void) { 
    Vector3D v(x, y, z); 
    Vector3D* normVector = VectorMath::norm(v); 

    // delete v; 
    //^you're not deleting it! 
}  

そしてnormあなたは非常にきれいなコードで終わるメンバ関数を作ることによって:

をあなたのコードでは、今、メモリリークが発生しています
int main(void) { 
    Vector3D v(x, y, z); 
    Vector3D normVector(v.norm()); 
}  

ポインタがなく、リークがなく、すべてセクシーです。

+0

OK、ありがとう、それは動作するようです。私は前にそれを試したことを誓い、それは失敗しました - しかし、それは今働いています...メモリリークのことについてのポインタをありがとう...私はそれらについての新しい質問をするでしょう... –

+0

@GMan、印象派の答え:) – mahesh

4

のいずれかを助けていません。代わりにnormという名前のグローバル関数を定義しました。何をする必要がある定義でメソッド名を修飾である:

Vector3D* Vector3D::norm(Vector3D* vector) 
+0

あなたは私より24秒も早いです。 :[ – GManNickG

0
Vector3D* VectorMath::norm(Vector3D* vector) { // can't be found by linker 
    // do vector calculations 
    return new Vector3D(xHead, yHead, zHead, xTail, yTail, zTail); 
} 
関連する問題