ページ 11

delete関数で"未解決の外部シンボル"のエラー

Posted: 2016年2月26日(金) 14:26
by bidou
件名のとおり、下記のプログラムで未解決の外部シンボルのエラーが出てしまいます。

phadeout.cpp

コード:

#include"phadeout.h"
#include"Dxlib.h"
#include"GV.h"
int alpha = 0;
int phadestate = 0;
Cphade *phade = new Cphade(DEF_PHADE);

void phadeout(){
	if (phadestate == 0){
		phadestate = 1;
	}
	if (phadestate == -1){

	}
}

Cphade::Cphade(){
	PHADEMODE = NORMAL;
	alpha = 0;
	mode = 0;
	endflag = false;
}

Cphade::Cphade(E_PHADEMODE f){
	alpha = 0;
	mode = 0;
	endflag = false;
	PHADEMODE = f;
}

void Cphade::Process(){
	switch (PHADEMODE){
	case NORMAL:
		if (mode == 0){
			alpha += 16;
		}
		if (mode == 1){
			alpha -= 16;
		}
		if (alpha > 255){
			alpha = 255;
			mode = 1;
		}
		if (alpha < 0){
			alpha = 0;
			endflag = true;
		}
		break;
	}
	//endflagがtrueになったら自己クラスを破棄する
	if (endflag == true){
		delete phade;
		phade = new Cphade(DEF_PHADE);
	}
}

void Cphade::Draw(){
	switch (PHADEMODE){
	case NORMAL:
		SetDrawBlendMode(DX_BLENDMODE_ALPHA,alpha);
		DrawBox(0, 0, WINDOW_X, WINDOW_Y, GetColor(0, 0, 0), 1);
		break;
	}
	SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0);

}
E_PHADEMODE Cphade::getmode(){
	return PHADEMODE;
	
}

int phadeMgr_flag;
void phadeMgr(){
	if (phadeMgr_flag == 0){
		
		phadeMgr_flag = 1;
	}
	
}
//これを外部参照する
void phadeout(E_PHADEMODE f){
	if (phade->getmode() != f){
		delete phade;
		phade = new Cphade(f);
	}
}

phadeout.h

コード:

#ifndef DEF_PHADEOUT_H
#define DEF_PHADEOUT_H
extern int phadestate;

void phadeMgr();
void phadeout();

enum E_PHADEMODE{
	DEF_PHADE,
	NORMAL
};

class Cphade{
protected:
	
	E_PHADEMODE PHADEMODE;//何番のフェードアウトか
	int mode;//同一種のフェードの実行中どの状態か
	int alpha;//アルファブレンド値(一部のフェードで利用)
	bool endflag;//終わったらtrueになりフェードクラスが破棄される
public:
	E_PHADEMODE getmode();
	Cphade();
	Cphade(E_PHADEMODE);
	~Cphade();
	void Process();
	void Draw();

};
extern Cphade *phade;
#endif
エラー:
エラー 1 error LNK2019: 未解決の外部シンボル "public: __thiscall Cphade::~Cphade(void)" (??1Cphade@@QAE@XZ) が関数 "public: void * __thiscall Cphade::`scalar deleting destructor'(unsigned int)" (??_GCphade@@QAEPAXI@Z) で参照されました。 C:\Users\森康一\Documents\Visual Studio 2013\Projects\0225proj\0225proj\phadeout.obj 0225proj

コメントアウトでの原因調査の結果 2箇所のdelete phade;がエラーの原因となっていることが判明したのですが、エラーが発生せず動くにはどうすればよいのかわかりません。よろしくお願いします。

Re: delete関数で"未解決の外部シンボル"のエラー

Posted: 2016年2月26日(金) 15:03
by みけCAT
テストしていませんが、Cphadeクラスのデストラクタが宣言されているのに定義されていないからエラーが出ているのだと思います。
デストラクタを定義するか、宣言を削除するといいでしょう。

【追記】

コード:

class TomoriNao {
    public:
    TomoriNao();
    ~TomoriNao();
};

TomoriNao::TomoriNao() {
}

int main() {
    TomoriNao *t = new TomoriNao;
    delete t;
    return 0;
}
というコードをコンパイルすると、

コード:

/tmp/ccYKytoS.o: In function `main':
prog.cc:(.text+0x39): undefined reference to `TomoriNao::~TomoriNao()'
collect2: error: ld returned 1 exit status
というエラーが出ました。
そして、TomoriNaoクラスのデストラクタを定義するか、デストラクタの宣言を削除することでエラーが出なくなることを確認しました。

Re: delete関数で"未解決の外部シンボル"のエラー

Posted: 2016年2月26日(金) 15:12
by bidou
ありがとうございます。デストラクタの作成で解決しました。完全にうっかりミスでした。