LNK2019エラーについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
みーや

LNK2019エラーについて

#1

投稿記事 by みーや » 9年前

DXライブラリで3Dゲームを作っています。
自キャラの状態が増えてきたので、ステートパターンでコード全体を書き換えたところ次のようなエラーが出るようになりました。
いろいろ試したのですが、エラー文が難解で何を言っているのかよくわかりません。
すみませんがご助力願います。

《エラー文》
エラー 9 error LNK2019: 未解決の外部シンボル "public: virtual class CharaState * __thiscall CharaState::processInput(struct DxLib::tagVECTOR)" (?processInput@CharaState@@UAEPAV1@UtagVECTOR@DxLib@@@Z) が関数 "public: __thiscall std::_Generic_error_category::_Generic_error_category(void)" (??0_Generic_error_category@std@@QAE@XZ) で参照されました。 D:\3dgame\projects\20160403_state_pattern_jissou\CharaStateWalk.obj 3dbasic

《コード一部抜粋》
CharaState.h

コード:

#ifndef CHARASTATE_H_LOADED
#define CHARASTATE_H_LOADED

#include <DxLib.h>
#include "Chara.h"

class Chara;

class CharaState
{
private:
	void setKabeYuka(MV1_COLL_RESULT_POLY *kabe[], MV1_COLL_RESULT_POLY *yuka[], int *kabeNum, int *yukaNum, Chara *pChara);
	void collCheckKabe(MV1_COLL_RESULT_POLY *kabe[], int kabeNum, int moveFlag, VECTOR oldPos, VECTOR *newPos, VECTOR pMoveVector);
	virtual CharaState* collCheckYuka(MV1_COLL_RESULT_POLY *yuka[], int yukaNum, VECTOR *newPos);

public:
	//virtual ~CharaState();
	virtual CharaState* processInput(VECTOR pMoveVector);
	virtual CharaState* update(VECTOR *pMoveVector);
	virtual void enter(Chara *pChara);
	CharaState* move(Chara *pChara, VECTOR pMoveVector);
};

#endif
CharaState.cpp

コード:

#include "Chara.h"
#include "CharaState.h"
#include "CharaStateJump.h"
#include "DEFINE_CONSTANTS.h"

extern int gWorldModel;
extern MV1_COLL_RESULT_POLY_DIM gHitDim;

void CharaState::setKabeYuka(MV1_COLL_RESULT_POLY *kabe[], MV1_COLL_RESULT_POLY *yuka[], int *kabeNum, int *yukaNum, Chara *pChara)
{
//省略
}

void CharaState::collCheckKabe(MV1_COLL_RESULT_POLY *kabe[], int kabeNum, int moveFlag, VECTOR oldPos, VECTOR *newPos, VECTOR pMoveVector)
{
//省略
}

//このcollCheckYukaはジャンプ時以外のもの
CharaState* CharaState::collCheckYuka(MV1_COLL_RESULT_POLY *yuka[], int yukaNum, VECTOR *newPos)
{
//省略
}

//★gHitDimの解放処理を忘れないこと
CharaState* CharaState::move(Chara *pChara, VECTOR pMoveVector)
{
//省略
}

CharaStateWalk.h

コード:

#ifndef CHARASTATEWALK_H_LOADED
#define CHARASTATEWALK_H_LOADED

#include "CharaState.h"

class CharaStateWalk : public CharaState
{
public:
	virtual CharaState* update(VECTOR *pMoveVector);
	virtual CharaState* processInput(VECTOR pMoveVector);
	virtual void enter(Chara *pChara);
};

#endif
CharaStateWalk.cpp

コード:

#include "Chara.h"
#include "CharaStateStand.h"
#include "CharaStateWalk.h"
#include "CharaStateJump.h"
#include "DEFINE_CONSTANTS.h"

CharaState* CharaStateWalk::update(VECTOR *pMoveVector)
{
	if (pMoveVector->x == 0 && pMoveVector->z == 0)
	{
		return new CharaStateStand();
	}

	return nullptr;
}

CharaState* CharaStateWalk::processInput(VECTOR pMoveVector)
{
	if (CheckHitKey(KEY_INPUT_SPACE))
	{
		return new CharaStateJump(PLAYER_JUMP_POWER);
	}

	return nullptr;
}

void CharaStateWalk::enter(Chara *pChara)
{
	//自キャラの初期アニメーションは「立ち」
	pChara->playAnim(ECharaAnim_Walk);
}



アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: LNK2019エラーについて

#2

投稿記事 by みけCAT » 9年前

エラー文にある通り、CharaState* CharaState::processInput(VECTOR pMoveVector)の定義が無いようですね。
また、CharaState* CharaState::update(VECTOR *pMoveVector)およびvoid CharaState::enter(Chara *pChara)の定義も見当たりません。

これらの関数を実装したくないのであれば、宣言の後に=0を追加して純粋仮想関数にするといいでしょう。

エラーが出た

コード:

struct a {
    virtual void x();
    virtual ~a() {}
};
struct b : public a {
    virtual void x();
};
void b::x() {}
int main() {
    a* z = new b;
    delete z;
}
エラーが出なかった

コード:

struct a {
    virtual void x();
    virtual ~a() {}
};
struct b : public a {
    virtual void x();
};
void a::x() {}
void b::x() {}
int main() {
    a* z = new b;
    delete z;
}
エラーが出なかった

コード:

struct a {
    virtual void x() = 0;
    virtual ~a() {}
};
struct b : public a {
    virtual void x();
};
void b::x() {}
int main(){
    a* z = new b;
    delete z;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

みーや

Re: LNK2019エラーについて

#3

投稿記事 by みーや » 9年前

指摘された通り純粋仮想関数にしたところうまく出来ました!!!
基底クラスのvirtualメソッドも定義しておかなければならなかったのですね。
とても勉強になりました。
丁寧に例まで示して教えていただき本当にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る