作者shadowth (ウィンディ@イージス)
看板C_and_CPP
標題[問題] 關於C++的函數指標陣列實作
時間Thu Jan 19 16:41:55 2017
開發平台(Platform): (Ex: Win10, Linux, ...)
Windows
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
VC++ (VS 2015社群版)
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
DxLib
問題(Question):
現在是我在遊戲中要實做敵人路徑和子彈發射路徑,
但我發覺用switch的話程式碼會越做越大,
所以我現在想要照以下網頁講的範例做一個函數指標陣列。
http://dixq.net/rp/12.html
但問題來了,這是C下面的函數指標陣列。
我用同樣的方法在類別內實作時編輯器會出現錯誤。
#include <cmath>
#include "DxLib.h"
class ENEMY_SAKO {
...
void MovePattern01();
void MovePattern02();
void MovePattern03();
void MovePattern04();
void(*EnemyMovePattern[])(void) = {
MovePattern01,
MovePattern02,
MovePattern03,
MovePattern04 };
...
}
在黃色的地方編輯器會顯示
「類型"void(ENEMY_SAKO::*)()"的值無法用來初始化類型"void(*)()"的實體。
請問這大概是什麼原因造成的呢?? 有沒有別的方式可以做到一樣的效果? 謝謝!!
註:
各MovePattern的程式碼如下:
/*Move Pattern Garage*/
void ENEMY_SAKO::MovePattern01()
{
double player_x, player_y;
(GAMEPLAY::Instance())->GetPlayerPosition(&player_x, &player_y);
move_angle = atan2(player_y - y, player_x - x);
moveSpeed = 1.5;
}
void ENEMY_SAKO::MovePattern02()
{
move_angle = M_PI_4 / 2;
moveSpeed = 1.0;
}
void ENEMY_SAKO::MovePattern03()
{
}
void ENEMY_SAKO::MovePattern04()
{
move_angle = M_PI_2;
moveSpeed = 1.2;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.49.111
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1484815318.A.0E1.html
1F:→ bachelorwhc: 編譯器說的很清楚 型別不符 01/19 17:35
2F:→ bachelorwhc: method其實有隱含參數this 只是你看不到 01/19 17:35
4F:推 chchwy: 都用VS2015了 改用lambda來做吧 01/19 20:31
5F:推 ronin728: 有策略模式 有std::function 為何要用Function pointer 01/21 01:30
6F:→ w0005151: 延續樓上,effective C++ 條款35可參閱看看 01/23 21:04
7F:推 Sirctal: 再延續樓上C++11出來後 effective modern c++ item 34 01/24 09:45