「CPlayer」と名前の付いたクラスが、純粋仮想関数をオーバーライド出来ない問題
whojinn 2015/02/02(Mon) 00:44
アプリの作成中に、「run-time check failure #0」というエラーがおき、プログラムが実行しなくなってしまいました。調べたところ、「CPlayer」と名づけたクラスを宣言し、純粋仮想関数をオーバーライドしたのが原因のようでした。他の文字を継ぎ足す(末尾に適当な文字を入れる)、全て小文字、或いは大文字等ではエラーは起きませんでした。
製作者様、ならびに皆様のほうで再現していただけると幸いです。
念のため、エラーを再現する際に用いたソースを以下に転載致します。
(Header.h)
#pragma once
class a//適当な名前のクラス
{
protected:
virtual void b()=0;//純粋仮想関数
};
(Header1.h)
#pragma once
#include"Header.h"
class CPlayer:a //問題の名称
{
public:
void b()override //純粋仮想関数をオーバーライド
{
}
};
(Main.cpp)
# include <Siv3D.hpp>
#include"Header1.h"
void Main()
{
std::unique_ptr<CPlayer>p = std::make_unique<CPlayer>();
while (System::Update())
{
p->b(); //エラーが発生する
}
}
Reputeless 2015/02/02(Mon) 09:50
Siv3D 側の誤りです。
Siv3D エンジンの内部で同名のクラスが定義されていたことが原因です。
将来のバージョンで、クラス名の重複が起こらないよう修正します。
現時点での対処法は、クラス名の変更か、名前空間の使用です。
# include <Siv3D.hpp>
namespace myNamespace
{
class IPlayer
{
public:
~IPlayer() = default;
virtual void doSomething() = 0;
};
class CPlayer : public IPlayer
{
public:
void doSomething() override {}
};
}
void Main()
{
using namespace myNamespace;
std::unique_ptr<IPlayer> p = std::make_unique<CPlayer>();
while (System::Update())
{
p->doSomething(); // OK
}
}