0

私はPlayerクラスを含む単純なゲームを作成しており、インスタンス化されたときにプレーヤーを保持するための配列を作成しました。問題は、プログラムを実行するたびに、LNK2019エラー(「未解決の外部シンボル」)が発生することです。なぜこれが起こっているのか、それを正しく機能させる方法がわかりません。どんな助けでも大歓迎です。

Player *player = new Player[9];
for(int i = 0; i< world1.numPlayers;i++) // ADD PLAYERS TO ARRAY
{
    Player tempplayer(3,3,5,1);
    player[i] = tempplayer;

}

これはプレーヤークラスの定義です。

#pragma once
class Player
{
public:
Player(int width, int height, int xPos, int health );
~Player(void);
Player();
int getWidth();
int getHeight();
int getHealth();
int getPos();
void setHealth(int newHealth);
bool isAlive();
int width;
int height;
int health;
int xPos;

    };

正確な警告は次のとおりです。「エラー1エラーLNK2019:未解決の外部シンボル "public:__thiscall Player :: Player(void)"(?? 0Player @@ QAE @ XZ)関数_main C:\ Users \ Alex \ Documents \ Visual Studio 2012 \ Projects \ ConsoleApplication2 \ ConsoleApplication2 \ World.obj ConsoleApplicati‌ on2 "

4

3 に答える 3

2

配列ループは問題ありません。

問題は、ファイルで宣言した1つ以上のクラスメンバー関数をファイルで定義しなかったことです。.cpp.hpp

エラー全体を表示しなかったため、どちらかはわかりませんが、定義が空の場合でも、すべて定義されていることを確認してください。

一般的な原因はデストラクタです。何もする必要がない場合は、定義するのを忘れがちです。

Player::~Player()
{
}

これは、デフォルトのコンストラクターでもあります。

Player::Player()
{
}

それらすべてを定義してください!

于 2013-01-18T04:15:31.503 に答える
0

Martinは、その配列にポインタを割り当てる必要があるのは正しいことです。このようなエラーがあれば、コンパイル時の警告が表示されると思います。

リンカエラーの場合-リンカ警告は通常、検出できないものを出力します。これは通常、エラーの原因を特定する、または少なくとも正しい方向を指すのに十分です。完全な警告を貼り付けることができますか?

通常、リンク時間エラーは、dreamlaxによるコメントで言及されているように、未定義のメンバー関数の結果であるか、ライブラリの1つを含めることができませんでした。

于 2013-01-18T04:10:54.417 に答える
-2

クラスポインタ、インスタンス、コンストラクタを使用するのはちょっとおかしいようです。

コードは次のようになります。

Player *player[9];

for(int i = 0; i< world1.numPlayers;i++) // ADD PLAYERS TO ARRAY
{

    player[i] = new Player(3,3,5,1);

}

編集:これは元のリンクエラーの原因をバイパスするだけであることに注意してください。リンカは、デフォルトのコンストラクタであるPlayer::Player(void)、が見つからないと文句を言っています。私が間違っていなければ、。を使用して配列を作成するときに呼び出されますnew Player[9]。それを宣言すると、このエラーが解決され、私のバージョンの代わりに元のコードを使い続けることができます。

于 2013-01-18T04:09:26.257 に答える