Ошибка компоновщика C ++ LNK2019 - PullRequest
       27

Ошибка компоновщика C ++ LNK2019

0 голосов
/ 03 сентября 2011

Я все еще новичок в C ++ и не знаю, почему я получаю эти ошибки компоновщика при попытке вызова этих функций в другом классе.

Ошибки:

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)

Projectile.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;
}

Звезда определяется в Star.h здесь:

#ifndef STAR_H
#define STAR_H

#include <hge.h>

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

public:
    Star(float m, float r, float X, float Y, HTEXTURE);
    float getMass();
    float getRadius();
    float getX();
    float getY();
    Star() {}
};

#endif

1 Ответ

3 голосов
/ 03 сентября 2011

В классе Star объявлено несколько функций:

Star(float m, float r, float X, float Y, HTEXTURE);
float getMass();
float getRadius();
float getX();
float getY();

И вы пытаетесь использовать некоторые из них без предоставления определения , то есть тела функции, поэтому вы получаете эти ошибки компоновщика.

Добавьте новый файл .cpp в ваш проект с именем Star.cpp (хотя имя не имеет значения) и добавьте определения функций для класса Star, как вы это сделали для класса Projectile , (Вы можете просто добавить их в любой файл .cpp в вашем проекте, например, Projectile.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() {}
};

Этот стиль является общим для небольших функций-получателей, таких как getMass, getRadius и т. Д., Которые просто возвращают переменную-член.

<ч />

Хотя это не имеет прямого отношения к вашему вопросу, я должен отметить несколько вещей:

  1. Создайте все свои функции "получения" (например, getMass и т. Д.) const (чтобы их можно было использовать на const Star объектах), поставив слово const после параметров (* 1030) * в данном случае) вот так: float getMass() const { return mass; }

  2. Поскольку у вас есть переменные-члены в классе 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);
...