2014-04-08 43 views
1

再次“纯虚拟方法称为错误”,我查了其他类似的问题,他们不能解决我的问题。 我有一个与提到的消息崩溃。我不做任何华丽的员工。该代码是大,所以只有重要的提取物:纯粹的虚拟方法称为错误和崩溃

class cCOLLECT_STR_NODES_HELPER 
{ 
    protected: 
    cCOLLECT_STR_NODES_HELPER(const std::string& searchStr, 
          const int attribute, 
       const cGTI_SRCH_TREE_NAME_DLG *pDlg) 
    : m_compareStr(searchStr), m_attr(attribute), pSrchDlg(pDlg) {} 

    virtual ~cCOLLECT_STR_NODES_HELPER() {} 

    public: 
    virtual bool TreatTheNode(const cGTC_TREE_NODE *curNode) = 0; 
... 
} 

然后去派生类:

class cCOLLECT_STR_TOP_NODES_HELPER : public cCOLLECT_STR_NODES_HELPER 
{ 
    public: 
    cCOLLECT_STR_TOP_NODES_HELPER(const std::string& searchStr, 
           const int attribute, 
        const cGTI_SRCH_TREE_NAME_DLG *pDlg) 
    : cCOLLECT_STR_NODES_HELPER(searchStr, attribute, pDlg) {} 

public: 
virtual bool TreatTheNode(const cGTC_TREE_NODE *curNode); 
... 
} 

TreatTheNode()分别实现:

bool cCOLLECT_STR_TOP_NODES_HELPER::TreatTheNode(const cGTC_TREE_NODE *curNode) {... 

然后派生类初始化:

cCOLLECT_STR_NODES_HELPER *pHelper; 

    cCOLLECT_STR_TOP_NODES_HELPER helper(searchStr, attribute, this); 
    pHelper = &helper; 

然后pHelper传入函数并在那里使用:

TraverseTreeNodes(const cGTC_TREE_NODE *curNode, 
       cCOLLECT_STR_NODES_HELPER *pHelper) const 
{ 
if (pHelper->TreatTheNode(curNode)) => CRASH 

该项目已成功构建。怎么了?

+0

你使用什么编译器?我怀疑pHelper是零,这就是吹了... –

+0

@Nathan Monteleone对不起,发现从侧面的错误。不,它不是空的。 –

+0

'项目成功建成。'叹气。为什么很多人提出一个问题来提出这个问题?只是因为你的项目建立好并不意味着它会运行良好。其次,你做了什么调试?第三,因为你的程序很大,所以更有理由相信你的问题是从你没有发布的代码开始的。 – PaulMcKenzie

回答

0

当我发现我身边的一个错误并删除了问题后,我决定取消删除并部分回答。我相信其他人可以从这个愚蠢的错误中受益(当你在3个小时内有最后期限时会犯错误)。

我知道这是明显的东西:其实我写的代码:

cCOLLECT_STR_TOP_NODES_HELPER helper(searchStr, attribute, this); 
pHelper = &helper; 

在现实情况是:

{ 
    cCOLLECT_STR_TOP_NODES_HELPER helper(searchStr, attribute, this); 
    pHelper = &helper; 
} 

所以帮手出去的范围......

问题是,我做了调试。 pHelper指出了一些有意义的东西,至少 就是它的样子。我仍不确定事故发生的具体情况,但原因很明显。当指出的对象超出范围时,可能是UB。 不过,如果有人描述内部发生的事情,我会接受答案。

+0

接受的答案在: http://stackoverflow.com/questions/20146111/avoiding-pure-virtual-function-call-in -derived-class-c?rq = 1 确认UB。 –

0

在这种情况下,您正面临一个空指针问题,因为您正在将未初始化的对象传递给参数,因此pHelper将没有值,因此会尝试崩溃程序。

+0

pHelper初始化:pHelper =&helper;它显然不是空的。 –

+0

哎呦,我没有看到。 –