0

我有:frw_trafic.h:

#define PI 3.14159265

namespace FRW
{
float angleToProperRadians(float angle);

class Car 
     {
public:
...
void transform(int time = 1);
...
private:
...
float velocDir; // angle in degrees, same as Sector angle
float wheelDir; // hence delta angle between car velocity direction and where wheels drive direction
float centerPosX;
float centerPosY; //these two are for car position
... }; }

这是一个声明了一个类和一个方法的命名空间。frw_traffic.cpp

#ifndef FRWTRAFFIC
#define FRWTRAFFIC
#include "frw_traffic.h"
#endif

#include <cmath>

using namespace FRW;

 float angleToProperRadians(float angle)
 {
for (; angle < -360 || angle > 360;)
{
    if (angle < -360)
    {
        angle = angle + 360;
        continue;
    }
    if (angle > 360)
    {
        angle = angle - 360;
    }
}

if (angle < 0)
{
    angle = 360 - angle;
}

return angle * PI / 180;
}
void Car::transform(int time) {
if (wheelDir == 0)
{
    centerPosX = centerPosX + static_cast<float>(time) * speed * cos(FRW::angleToProperRadians(velocDir)) ;
    centerPosY = centerPosY + static_cast<float>(time) * speed * sin(FRW::angleToProperRadians(velocDir)) ;
} }

方法 angleToProperRadians() 在 .h 中声明,在 .cpp 中定义,并使用在 .h 中定义的宏 PI 进行计算。然后,我使用 Car::transform() 方法计算对象在直线轨迹中的位置。它还在 .h 文件中声明为 Car 类的一部分,并在 .cpp 文件中定义。

此代码无法编译,给出“未解析的外部符号”。错误。AFA 这是一个链接错误,我相信宏或包含的东西搞砸了。我一直在拼命地尝试在 Stack Overflow 上使用有关此错误的其他问题,但是大多数人在使用外部库时遇到此错误。

请有人提供有关检查两次以查看此代码的真正问题的建议。

错误 LNK2019:在函数“public: void __thiscall FRW::Car::transform(int)”(?transform @汽车@FRW@@QAEXH@Z)

谢谢你。

4

1 回答 1

0

实际上,在这种特殊情况下,宏是无可指责的。链接是错误的,因为在 .h 中声明并在 .cpp 文件中定义的 angleToProperRadians() 方法是完全独立的函数。

事实上,来自 .h 的一个现在位于 FRW 命名空间中。事实上,.cpp 中的一个现在是另一个新的全局函数。和“使用命名空间 FRW;” 实际上并没有帮助这种情况,因为它可用于引用已定义的方法。

这是.cpp中的正确方法:

...
float FRW::angleToProperRadians(float angle)
{
for (...) {
...

请注意,当我们首先引用一个类然后定义它的方法时,它是如何进行的 180 转。

就是这样。感谢 Yves Daoust 在评论中指出这一点。

于 2016-11-05T12:02:42.077 回答