[英]segmentation fault when i call member function using pointer-to-member
我正在跟蹤三個顏色點 - 紅色,綠色和藍色。 我有currentFrames類,它包含幾個幀 - 來自相機和一些輔助幀的幀 - 以及一些操作/從幀中提取一些信息的方法。 假設我能夠找到每個點的質心,然后我想根據這個質心的位置調用特定的函數。 整個幀被划分為網格,並且網格的每個部分將具有分配給它的功能 - 當在該特定段中檢測到點時將調用該功能。
我的想法是創建指向成員函數的多維指針數組:
#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))
MyFuncPointerType functions[NUMBER_OF_POINTS][NUMBER_OF_SEGMENTS];
然后為此分配函數的地址,如:
functions[0][0] = ¤tFrames::something;
例如,當第一個點位於網格的第二個段中時,我將調用正確的函數(這將從currentFrames類中調用 - 這就是為什么我*this
作為對象傳遞給CALL_MEMBER_FN
:
CALL_MEMBER_FN(*this, functions[0][1])();
我開始時沒有那么復雜的例子 - 我想為每個點調用不同的函數,但每個段都是相同的(“在范圍內”):
class currentFrames
{
public:
void someMethod();
private:
void calculateVelocity();
void redPointDetected();
void redPointGone();
typedef void (currentFrames::*MyFuncPointerType)();
MyFuncPointerType functions[];
}
然后,在currentFrames的構造函數中,我執行以下操作:
currentFrames::currentFrames()
{
this->functions[0] = ¤tFrames::calculateVelocity;
this->functions[1] = ¤tFrames::redPointDetected;
}
然后,在currentFrames類的someMethod中,我嘗試調用成員函數:
void currentFrames::someMethod()
{
CALL_MEMBER_FN(*this, this->functions[0])();
}
但這給了我段錯誤。 我試圖將CALL_MEMBER_FN
定義為((ptrToObject)->*(ptrToMember))
,但這也給出了段錯誤。
應該怎么做? 有沒有更好的方法來實現我想要的?
MyFuncPointerType functions[];
你忘了給出數組的長度。 這將使其與MyFuncPointerType *functions
。 指針初始化為某個垃圾地址(可能為0),並在構造this->functions[0]
訪問this->functions[0]
時導致段。 這與CALL_MEMBER_FN無關。
將此行更改為
MyFuncPointerType functions[2];
它應該工作。 (演示: http : //ideone.com/q4D3e )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.