-2

ヘッダー ファイル「asteroid.h」には、構造体「Asteroid」があります。構造体では、次の関数を宣言します。

bool isCollidingWith (Asteroid a2);

cppファイル「asteroid.cpp」には、次のコードがあります

bool Asteroid::isCollidingWith (Asteroid a2)
{
    return true;
}

プログラムは私にエラーを与えます

「Asteroid::isCollidingWith(Asteroid)」への未定義の参照

「Asteroid::」を .cpp から削除しようとしましたが、役に立ちませんでした。別の .cpp では、メイン ファイル (編集できない collision.cpp) が「isCollidingWith」を呼び出します。

if (a1.isCollidingWith(a2))

上記の行は、私のプログラムがエラーを特定する場所です。collision.cpp は "asteroid.h" を #include しますが、asteroid.cpp は含みません。asteroid.cpp では、 I#include asteroid.hであるため、私のインクルージョンが間違っているとは思いません。「未定義の参照」エラーの一般的な原因についてオンラインで調べました。通常、.h ファイルと .cpp ファイルのパラメーターが異なるためですが、私のものは同じです。これを修正するために私ができることを誰かが知っていますか?

編集:小惑星cppのコード

#include "asteroid.h"
#include "point.h"
#include "line.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
new Asteroid asteroid1;
cout << "Program is running";
new Asteroid asteroid2;

string Asteroid::getInput (Asteroid a)
{
    cout << "whats the amount of vertices"
    double input;
    getline(cin, input);
    a.amountofpoints = input;
    input;
    double xinput;
    double yinput;
    cout << "input two numbers for the x and y of each vertice"
    while (input > 0)
    {
        getline(cin, input2);
        getline(cin, input3);
        a.vertice[input].x = input2;
        a.vertice[input].y = input3;
        input--;
    }
}
bool Asteroid::isCollidingWith (Asteroid a2) const
{
    //might need to take in Asteroid a2 to see if they're equal, not sure
    return true;
}
Point Asteroid::getCenter() const
{
    return a1;
}
double Asteroid::moveBy(double deltx, double delty) const
{
    return deltx;
    return delty;
}
void Asteroid::print() const
{
    cout << "Print Function" << endl;
    return a1;
}
Point Asteroid::addVertex(Point newvertex) const
{
    return newvertex;
}

asteroid.h のコード

#ifndef ASTEROID_H_INCLUDED
#define ASTEROID_H_INCLUDED
#include <iostream>
#include <string>
#include "point.h"
#include "line.h"
using namespace std;
struct Asteroid
{
    int amountofpoints;

    Point vertice;
    /**
    Create a line signment iwth the given endpoints.
    */
    bool isCollidingWith (Asteroid a2) const;
    Point getCenter () const;
    string getInput (Asteroid a);
    double moveBy (double deltx, double delty);
    std::ostream& print(std::ostream &out);
    Point addVertex(Point newvertex);
    //bool isCollidingWith;
};
#endif

私は、cpp の関数の「内部」が基本的に空であることを認識しています。現在、プログラムをコンパイルして、各関数を一度に 1 つずつ処理できるようにしようとしていますが、エラーが原因で妨げられています。ビルド メッセージは次のとおりです。

C:\Users\jclary\Desktop\adt_asteroids2\collision.cpp|44|「Asteroid::isCollidingWith(Asteroid) const」への未定義の参照|

4

1 に答える 1

0

リンカーは、実行可能ファイルを作成するために、すべてのソース ファイル (*.cpp) を調べる必要があります。したがって、何らかの方法ですべてのファイル名をリンカに与える必要があります。どのように正確に?それはプラットフォームによって異なります。

gcc を使用している場合:

g++ asteroid.cpp collision.cpp -o whatever

MS Visual Studio を使用している場合:

asteroid.cppファイル、collision.cppおよびすべてのヘッダー ファイルを「プロジェクト」または「ソリューション」、またはそれが呼ばれるものにドロップします。

別のシステムを使用している場合は、質問でそれを指定してください。それに詳しい人が助けてくれます。

于 2013-10-27T21:10:02.000 に答える