「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
}
}
編集
whojinn  2015/02/02(Mon) 10:20
クラスを変更することで対処いたしました。ご対応感謝いたします。
編集
件名
Re: 「CPlayer」と名前の付いたクラスが、純粋仮想関数をオーバーライド出来ない問題
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -