簡體   English   中英

當我使用指向成員的指針調用成員函數時,分段錯誤

[英]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] = &currentFrames::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] = &currentFrames::calculateVelocity;
    this->functions[1] = &currentFrames::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM