我正在编写一个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
代码:
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*);
};
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
为什么链接器找不到该VectorMath::norm方法?乍一看,我认为我需要声明这样的规范:
Vector3D* VectorMath::norm(Vector3D* vector) {
Run Code Online (Sandbox Code Playgroud)
但这也无济于事......
GMa*_*ckG 15
你错过了这个:
//VectorMath.cpp
#include "VectorMath.h"
|
V - here
Vector3D* VectorMath::norm(Vector3D* vector)
{
...
}
Run Code Online (Sandbox Code Playgroud)
该norm功能是其中的一部分VectorMath::.没有它,你只需要一个免费的功能.
这更多是关于你的设计,但为什么你使用指向一切?这更清洁:
class VectorMath {
public:
static Vector3D norm(const Vector3D&);
};
Run Code Online (Sandbox Code Playgroud)
参考,您使用的是C++,因此不要编写C代码.当我打电话给你时会发生什么?
VectorMath::norm(0); // null
Run Code Online (Sandbox Code Playgroud)
它会崩溃,你必须检查,在这种情况下,它应该返回什么?这些都是通过使用引用清理的.
另外,为什么不让这些成员Vector3D上课呢?
Vector3D* v = new Vector3D(x, y, z);
v->norm(); // normalize would be better, in my opinion
Run Code Online (Sandbox Code Playgroud)
最后,堆栈分配东西.你的代码现在有内存泄漏:
int main(void) {
Vector3D* v = new Vector3D(x, y, z);
Vector3D* normVector = VectorMath::norm(v);
// delete v;
// ^ you're not deleting it!
}
Run Code Online (Sandbox Code Playgroud)
将其更改为此,并使用RAII概念:
int main(void) {
Vector3D v(x, y, z);
Vector3D* normVector = VectorMath::norm(v);
// delete v;
// ^ you're not deleting it!
}
Run Code Online (Sandbox Code Playgroud)
通过创建norm成员函数,您最终得到了非常干净的代码:
int main(void) {
Vector3D v(x, y, z);
Vector3D normVector(v.norm());
}
Run Code Online (Sandbox Code Playgroud)
没有指针,没有泄漏,都很性感.
| 归档时间: |
|
| 查看次数: |
5805 次 |
| 最近记录: |