前提・実現したいこと
関数ポインタを引数に持つ関数を作成したい。
実装したいものは、以下のように関数の入った箱(MethodBox)とそれを読むリーダーがあり、リーダーは読み込んだ関数をキューへ保存していき、一番右端のMethodBoxを読み終わったら、順次キューに入った関数を実行していくようなシステムを作りたい。
発生している問題・エラーメッセージ
C2664'MethodBox::MethodBox(int,int,int,int,const char *,Method::DRAW)': 引数 6 を '_Ty' から 'Method::DRAW' へ変換できません。 DxLibTemplate2017 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\include\xutility
該当のソースコード
関数ポインタの定義 Method.h
C++
1#pragma once 2#include <DxLib.h> 3 4class Method 5{ 6public: 7 Method() = default; 8 ~Method() = default; 9 10 typedef void (*DRAW) (); //円を描画する関数のポインタ 11 12 void RedCircle() 13 { 14 DrawCircle(100, 100, 10, GetColor(255, 0, 0)); 15 } 16 17 void BlueCircle() 18 { 19 DrawCircle(100, 100, 10, GetColor(0, 0, 255)); 20 } 21};
関数を持つ箱 MethodBox.h
C++
1#pragma once 2 3#include "Task.h" 4#include "Method.h" 5 6class MethodBox : public Task //このように継承するとMethodBoxを使用する関数からもTaskの公開メンバをいじれる 7{ 8private: 9 int m_x, m_y, m_sizeX, m_sizeY; //箱の位置・大きさ 10 const char* m_str; //箱に書かれている文字 11 Method::DRAW m_fp; //読まれると実行される関数のポインタ 12 13public: 14 MethodBox(int _x, int _y, int _sizeX, int _sizeY, const char* _str, Method::DRAW _fp); 15 ~MethodBox() = default; 16 17 bool update() override; 18 void draw() const; 19 void move(); //D&D 20};
Method.cpp
C++
1#include "MethodBox.h" 2#include "Define.h" 3#include "DxLib.h" 4 5MethodBox::MethodBox(int _x, int _y, int _sizeX, int _sizeY, const char* _str, Method::DRAW _fp) 6{ 7 m_x = _x; 8 m_y = _y; 9 m_sizeX = _sizeX; 10 m_sizeY = _sizeY; 11 12 m_str = _str; 13 m_fp = _fp; 14} 15 16bool MethodBox::update() 17{ 18 move(); 19 return true; 20} 21 22void MethodBox::draw() const 23{ 24 int width = m_x + GetFontSize(); //文字のx位置 25 int height = m_y + (m_sizeY / 2) - GetFontSize()/2; //文字のy位置 26 27 DrawBox(m_x, m_y, m_x + m_sizeX, m_y + m_sizeY, GetColor(255, 255, 255), true); //四角形の描画 28 DrawFormatString(width, height, GetColor(0,0,0), m_str); //文字の描画 29} 30 31//D&D処理 32void MethodBox::move() 33{ 34 //左クリックされていたら 35 if (GetMouseInput() & MOUSE_INPUT_LEFT) 36 { 37 int mousePosX, mousePosY; 38 39 GetMousePoint(&mousePosX, &mousePosY); //マウスの座標を取得する 40 41 //クリックした座標がMethodBoxの範囲内であれば、 42 if 43 ( 44 (mousePosX >= m_x) && (mousePosX <= (m_x + m_sizeX)) //X範囲 45 && 46 (mousePosY >= m_y) && (mousePosY <= (m_y + m_sizeY)) //Y範囲 47 ) 48 while (GetMouseInput() & MOUSE_INPUT_LEFT) //左クリックされている間、 49 { 50 GetMousePoint(&mousePosX, &mousePosY); 51 52 //マウスカーソルが画面内であれば 53 if(mousePosX > 0 && mousePosX < Define::WIN_W && mousePosY > 0 && mousePosY < Define::WIN_H) 54 { 55 //MethodBoxの座標を変更 56 m_x = mousePosX - (m_sizeX / 2); 57 m_y = mousePosY - (m_sizeY / 2); 58 } 59 60 } 61 } 62}
MethodBox生成 GameScene.cpp
C++
1#include "GameScene.h" 2#include <DxLib.h> 3 4using namespace std; 5 6//このシーンで使用するオブジェクトの生成 7GameScene::GameScene() 8{ 9 m_field = make_shared<Field>(); 10 m_reader = make_shared<Reader>(); 11 m_methodBox = make_shared<MethodBox>(200,200,130,50,"赤い丸を表示", &Method::RedCircle); 12} 13 14//現在のシーンのフレーム処理 15bool GameScene::update() 16{ 17 m_field->update(); 18 m_reader->update(); 19 m_methodBox->update(); 20 return true; 21} 22 23//現在のシーンの描画処理 24void GameScene::draw() const 25{ 26 m_field->draw(); 27 m_reader->draw(); 28 m_methodBox->draw(); 29} 30
試したこと
Typedefの使い方などを調べなおした。
関数のポインタを使用する -C++プログラミング
補足情報(FW/ツールのバージョンなど)
windows10 VisualStudio2019
プログラミング初心者です。足りない情報などあれば追記いたしますのでご連絡ください。
回答3件
あなたの回答
tips
プレビュー