C++;链接器错误LNK2019 我仍然对C++有点陌生,不知道为什么在尝试调用另一个类中的这些函数时,我会得到这些链接错误。

C++;链接器错误LNK2019 我仍然对C++有点陌生,不知道为什么在尝试调用另一个类中的这些函数时,我会得到这些链接错误。,c++,linker,lnk2019,C++,Linker,Lnk2019,错误是: error LNK2019: unresolved external symbol "public: float __thiscall Star::getMass(void)" (?getMass@Star@@QAEMXZ) referenced in function "public: void __thiscall Projectile::Update(class Star * const,int)" (?Update@Projectile@@QAEXQAVStar@@H@Z)

错误是:

error LNK2019: unresolved external symbol "public: float __thiscall Star::getMass(void)" (?getMass@Star@@QAEMXZ) referenced in function "public: void __thiscall Projectile::Update(class Star * const,int)" (?Update@Projectile@@QAEXQAVStar@@H@Z)

error LNK2019: unresolved external symbol "public: float __thiscall Star::getX(void)" (?getX@Star@@QAEMXZ) referenced in function "public: void __thiscall Projectile::Update(class Star * const,int)" (?Update@Projectile@@QAEXQAVStar@@H@Z)

error LNK2019: unresolved external symbol "public: float __thiscall Star::getY(void)" (?getY@Star@@QAEMXZ) referenced in function "public: void __thiscall Projectile::Update(class Star * const,int)" (?Update@Projectile@@QAEXQAVStar@@H@Z)
cpp:

#include <hge.h>
#include "Projectile.h"
#include "Physics.h"
#include "Star.h"
#include <math.h>

Projectile::Projectile(float xV, float yV, float x, float y, float m, HTEXTURE tex)
{
    xVel = xV;
    yVel = yV;
    xPos = x;
    yPos = y;
    mass = m;
    quad.tex = tex;
}

void Projectile::Update(Star stars[], int length)
{
    for(int i = 0; i<length; ++i)
    {
        float force = Physics::calcGravityForce(mass, stars[i].getMass(), Physics::calcDist(xPos, yPos, stars[i].getX(), stars[i].getY()));
        Accelerate(force, stars[i].getX() - xPos, stars[i].getY() - yPos);
    }
}

void Projectile::Accelerate(float force, float x, float y)
{
    float c = sqrt((x * x) + (y * y));
    xVel += x/c;
    yVel += y/c;
}
#包括
#包括“射弹.h”
#包括“Physics.h”
#包括“Star.h”
#包括
射弹:射弹(浮体xV、浮体yV、浮体x、浮体y、浮体m、HTEXTURE tex)
{
xVel=xV;
yVel=yV;
xPos=x;
yPos=y;
质量=m;
quad.tex=tex;
}
空射弹::更新(星号[],整数长度)
{

对于(int i=0;i您在
Star
类中声明了几个函数:

Star(float m, float r, float X, float Y, HTEXTURE);
float getMass();
float getRadius();
float getX();
float getY();
您试图在不提供定义的情况下使用其中一些函数,也就是说,函数体,这就是为什么会出现这些链接器错误

向名为
Star.cpp
的项目中添加一个新的.cpp文件(尽管名称无关紧要),并添加
Star
类的函数定义,就像您为
类所做的那样。(您可以将它们添加到项目中的任何.cpp文件中,如
sproject.cpp
,但如果您有一个单独的头文件,最好也有一个单独的.cpp文件。)

或者,如果不希望在项目中有另一个cpp文件,可以将函数体放在类本身中:

class Star
{
private:
    float mass, radius, x, y;
    hgeQuad quad;

public:
    Star(float m, float r, float X, float Y, HTEXTURE);
    float getMass() { return mass; }
    float getRadius() { return radius; }
    float getX() { return x; }
    float getY() { return y; }
    Star() {}
};
这种风格在小型“getter”函数中很常见,如只返回成员变量的
getMass
getRadius


虽然这与你的问题没有直接关系,但我应该指出几点:

  • 使所有“getter”函数(如
    getMass
    等)
    const
    (以便它们可以用于
    const星型
    对象),方法是将单词
    const
    放在参数(本例中为
    ()
    )之后,如下所示:
    float getMass()const{return mass;}

  • 因为在
    Star
    类中有成员变量,所以应该在构造函数中将它们设置为一些合理的默认值,该值不带任何参数

  • 像这样:

    Star() : mass(0), radius(0), x(0), y(0) {}
    
    mass
    radius
    x
    y
    设置为
    0
    (这种不寻常的语法称为初始化器列表。您可以阅读它们。)

    您甚至可以通过使用默认参数在没有单独构造函数的情况下执行此操作:

    Star(float m = 0, float r = 0, float X = 0, float Y = 0, HTEXTURE = 0);
    

    Star
    类中声明了几个函数:

    Star(float m, float r, float X, float Y, HTEXTURE);
    float getMass();
    float getRadius();
    float getX();
    float getY();
    
    您试图在不提供定义的情况下使用其中一些函数,也就是说,函数体,这就是为什么会出现这些链接器错误

    向名为
    Star.cpp
    的项目中添加一个新的.cpp文件(尽管名称无关紧要),并添加
    Star
    类的函数定义,就像您为
    类所做的那样。(您可以将它们添加到项目中的任何.cpp文件中,如
    sproject.cpp
    ,但如果您有一个单独的头文件,最好也有一个单独的.cpp文件。)

    或者,如果不希望在项目中有另一个cpp文件,可以将函数体放在类本身中:

    class Star
    {
    private:
        float mass, radius, x, y;
        hgeQuad quad;
    
    public:
        Star(float m, float r, float X, float Y, HTEXTURE);
        float getMass() { return mass; }
        float getRadius() { return radius; }
        float getX() { return x; }
        float getY() { return y; }
        Star() {}
    };
    
    这种风格在小型“getter”函数中很常见,如只返回成员变量的
    getMass
    getRadius


    虽然这与你的问题没有直接关系,但我应该指出几点:

  • 使所有“getter”函数(如
    getMass
    等)
    const
    (以便它们可以用于
    const星型
    对象),方法是将单词
    const
    放在参数(本例中为
    ()
    )之后,如下所示:
    float getMass()const{return mass;}

  • 因为在
    Star
    类中有成员变量,所以应该在构造函数中将它们设置为一些合理的默认值,该值不带任何参数

  • 像这样:

    Star() : mass(0), radius(0), x(0), y(0) {}
    
    mass
    radius
    x
    y
    设置为
    0
    (这种不寻常的语法称为初始化器列表。您可以阅读它们。)

    您甚至可以通过使用默认参数在没有单独构造函数的情况下执行此操作:

    Star(float m = 0, float r = 0, float X = 0, float Y = 0, HTEXTURE = 0);
    

    哦,哇,我真傻,我完全忘了定义这些。对不起,谢谢你的帮助!@Nate如果这个答案回答了你的问题,不要忘了点击左边的复选标记将其标记为答案。哦,哇,我真傻,我完全忘了定义这些。对不起,谢谢你的帮助!@Nate如果这个答案回答了你的问题,不要忘记单击答案左侧的复选标记,忘记将其标记为答案。