2014-01-08 28 views
0

代碼非常直截了當。如果沒有IDumb並且我將dumbClass直接傳遞給dumbWin,代碼將起作用。但是當dumbClass具有IDumb接口時,代碼崩潰在print()回調函數內部的接口類導致崩潰

using namespace std; 

class IDumb { 
public : 
virtual void print() = 0; 
}; 

class dumbClass : public IDumb { 
public : 
void print() { 
    cout << "this is dumb class" << endl; 
} 
}; 

class dumbWin : public Fl_Window { 
IDumb *dc; 
public: 
dumbWin(IDumb *dc) : Fl_Window(100, 100, "win") { 
    Fl_Button *b = new Fl_Button(10, 10, 50, 25, "OK"); 
    b->callback((Fl_Callback*)callbk, this); 
    end(); 

    this->dc = dc; 
} 

void print() { 
    dc->print(); 
} 

static void callbk(void *p) { 
    cout << "OK" << endl; 
    ((dumbWin*)p)->print(); 
} 
}; 

int main(int argc, char **argv) 
{ 
IDumb *dC = new dumbClass(); 
dumbWin *dW = new dumbWin(dC); 
dW->show(); 

return Fl::run(); 
} 

回答

1

您呼叫設定this->dc之前調用b->callback。這會是一個問題嗎?您最好使用成員初始化:

dumbWin(IDumb *dc) : Fl_Window(100, 100, "win"), dc(dc) 

另外,爲IDumb提供虛擬析構函數。

+0

沒有工作。如果我在'dumbWin'的構造函數中調用'dc-> print()',它就可以工作。只有當我在回調中調用它時,它纔會失敗! – harsh

+0

你能提供關於它如何崩潰的更多細節嗎?什麼是調用堆棧? – Arkadiy

+0

我剛剛得到'segment fault(core dumped)'錯誤。有沒有辦法查看調用堆棧?我正在使用Eclipse – harsh