6

我正在编写一个 Vector3D 类,它调用 VectorMath 类的静态方法来执行计算。当我编译时,我得到这个:

bash-3.1$ g++ VectorMath.cpp Vector3D.cpp
/tmp/cc5cAPia.o:在函数“main”中:
Vector3D.cpp:(.text+0x4f7): 未定义引用 'VectorMath::norm(Vector3D*)'
collect2: ld 返回 1 个退出状态

编码:

矢量数学.h:

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

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

矢量数学.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

矢量3D.cpp

#include "Vector3D.h"
#include "VectorMath.h"
// ...
// vector implementation
// ...
int main(void) {
    Vector3D* v = new Vector3D(x, y, z);
    Vector3D* normVector = VectorMath::norm(v); // error here
}        

为什么链接器找不到VectorMath::norm方法?乍一看,我认为我需要像这样声明规范:

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

但这也无济于事......

4

3 回答 3

17

你错过了这个:

//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

最后,堆栈分配的东西。您的代码现在有内存泄漏:

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

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

将其更改为此,并使用RAII概念:

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());
}    

没有指针,没有泄漏,都很性感。

于 2009-07-31T01:51:57.723 回答
4

您还没有Vector3D::normVectorMath.cpp. 相反,您定义了一个名为norm. 您需要做的是限定定义中的方法名称:

Vector3D* Vector3D::norm(Vector3D* vector)
于 2009-07-31T01:51:33.650 回答
0
Vector3D* VectorMath::norm(Vector3D* vector) { // can't be found by linker
    // do vector calculations
    return new Vector3D(xHead, yHead, zHead, xTail, yTail, zTail);
}
于 2009-07-31T01:53:25.850 回答