我正在编写一个Vector3D类,该类在VectorMath类上调用静态方法来执行计算。当我编译时,我得到以下信息:

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

The code:

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
#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) {

但这也无济于事...

最佳答案

您缺少此:

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

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

关于静态方法的C++链接器问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1210282/

10-10 12:38