0

私はまだ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
4

1 に答える 1

2

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. 次のように、パラメーター(この場合)の後に単語を配置して、すべての「getter」関数(getMassetcなど)を作成します(オブジェクトconstで使用できるようにします)。const Starconst()float getMass() const { return mass; }

  2. クラスにはメンバー変数があるのでStar、パラメーターをとらないコンストラクターでそれらを適切なデフォルト値に設定する必要があります。

このような:

Star() : mass(0), radius(0), x(0), y(0) {}

、、、をに設定massします。(この異常な構文は初期化子リストと呼ばれます。ここでそれらについて読むことができます。)radiusxy0

デフォルトの引数を使用することで、個別のコンストラクターなしでこれを行うこともできます。

Star(float m = 0, float r = 0, float X = 0, float Y = 0, HTEXTURE = 0);
于 2011-09-03T19:10:13.003 に答える