需要知道如何在另一个cpp文件中正确创建新对象

时间:2010-05-31 10:53:29

标签: visual-c++

我上课了。现在的问题是,经过几次尝试,我仍然犯了很大的错误。我的问题是我不知道如何在另一个cpp文件中为这个类正确声明一个新对象。我想从我的其他cpp文件中调用/触发此RebarHandler类中的函数。我继续遇到诸如“未经初始化使用”,“调试断言失败”等问题。

在另一个cpp文件中,我包含了RebarHandler.h并且这样做:

CRebarHandler *test=NULL;
test->setButtonMenu2();

编译时,我不会给出任何错误。但是,在运行时,它会出错并且我的IE崩溃了。我需要帮助。

以下是我的意思:

    #pragma once

    class CIEWindow;

    class CRebarHandler  : public CWindowImpl<CRebarHandler>{
    public:
CRebarHandler(HWND hWndToolbar, CIEWindow *ieWindow);
CRebarHandler(){};

~CRebarHandler();

BEGIN_MSG_MAP(CRebarHandler)
    NOTIFY_CODE_HANDLER(TBN_DROPDOWN, onNotifyDropDown)
    NOTIFY_CODE_HANDLER(TBN_TOOLBARCHANGE, onNotifyToolbarChange)
    NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, onNotifyCustomDraw)
    NOTIFY_CODE_HANDLER(TBN_ENDADJUST, onNotifyEndAdjust)
    MESSAGE_HANDLER(WM_SETREDRAW, onSetRedraw)
END_MSG_MAP()

// message handlers
LRESULT onNotifyDropDown(WPARAM wParam, LPNMHDR pNMHDR, BOOL& bHandled); 
LRESULT onNotifyToolbarChange(WPARAM wParam, LPNMHDR pNMHDR, BOOL& bHandled);
LRESULT onNotifyCustomDraw(WPARAM wParam, LPNMHDR pNMHDR, BOOL& bHandled);
LRESULT onNotifyEndAdjust(WPARAM wParam, LPNMHDR pNMHDR, BOOL& bHandled);
LRESULT onSetRedraw(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

// manage the subclassing of the IE rebar
void subclass();
void unsubclass();
void handleSettings();
    void setButtonMenu2();
bool findButton(HWND hWndToolbar);

    private:
// handles to the various things
HWND m_hWnd;
HWND m_hWndToolbar, m_hWndRebar, m_hWndTooltip;
HMENU m_hMenu;

int m_buttonID;
int m_ieVer;

CIEWindow *m_ieWindow;

// toolbar finding functions
void scanForToolbarSlow();
void getRebarHWND();
void setButtonMenu();

};

1 个答案:

答案 0 :(得分:1)

CRebarHandler的作用并不重要,这些行很糟糕:

CRebarHandler *test=NULL; 
test->setButtonMenu2(); 

你有这个指针,你首先说“它没有指向任何东西”,然后你说“继续使用指针指向的东西,设置按钮菜单。”不会发生。

尝试:

CRebarHandler test; 
test.setButtonMenu2(); 

CRebarHandler test= new CRebarHandler(); 
test->setButtonMenu2(); 

取决于您想要进行测试的生命周期。您可能希望使用constructor-that-takes-parameters而不是默认构造函数。我的观点是你必须有CRebarHandler才能在其上调用方法。