6

像“vec3”这样的类通常只使用标题吗?

这是我的实际代码:

#ifndef VECTOR3_H
#define VECTOR3_H

#include <math.h>

class vec3
{
public:
    double x, y, z;
    vec3();
    vec3(double x, double y, double z) : x(x), y(y), z(z) {}
    double lenght()
    { return sqrt(pow(x, 2) * pow(y, 2) * pow(z, 2));}
    double lenghtSquared()
    { return pow(x, 2) + pow(y, 2) + pow(z, 2);}
    double distance(vec3 v)
    { return sqrt(pow(x - v.x, 2) * pow(y - v.y, 2) * pow(z - v.z, 2));}
    double distanceSquared(vec3 v)
    { return pow(x - v.x, 2) + pow(y - v.y, 2) + pow(z - v.z, 2);}
    float angle(vec3 v)
    { return (float) acos(dot(v) / lenght() * v.lenght());}
    double dot(vec3 v)
    { return x * v.x + y * v.y + z * v.z;}
    void cross(vec3 v) {
        double a = y * v.z - v.y * z; double b = z * v.x - v.z * x;
        double c = x * v.y - v.x * y; x = a; y = b; z = c;}
    void normalize()
    { x, y, z /= lenght();}
};

#endif // VECTOR3_H

我可以更好地创建一个源文件而不仅仅是一个标题吗?如果你有一些建议,我喜欢它们:)

提前致谢

编辑:什么是内联?

4

2 回答 2

9

如果您希望它通常可用,则类定义需要放在标题中。如果它在源文件中,则它仅在该源文件中可用,在其他文件中不可用。

成员函数定义可以像您的一样内联;或者您可以将它们移动到源文件中,只在类中留下声明。

这两种方法各有利弊。仅标头实现更易于共享和分发,并提供更多优化机会,因为函数更易于内联;但如果许多翻译单元中包含大量大型函数,可能会导致构建时间更长,并且如果您想将其用作类接口的“文档”,则会使标题更加混乱。

什么是内联?

这意味着一个函数要么在类中定义,要么被声明inline。无论哪种情况,其目的都是放宽“一个定义规则”,以便您可以在多个翻译单元中定义函数;并且必须在使用它的每个单元中定义。如果您希望定义出现在标题中(可能包含在多个单元中),这是必要的。它为编译器提供了更好的内联函数调用的机会,将它们替换为函数体以避免调用成本。

于 2013-05-08T12:55:01.753 回答
2

没有什么不寻常的,不。在某些情况下(例如模板),它实际上是必需的。

在实践中,将成员定义放在一个cpp文件中可以使代码更易于管理,并且可以更快地构建您的项目,但在这种情况下,代码太少,不会有任何区别。

于 2013-05-08T12:46:11.460 回答