2014-04-08 3 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 함수에 전달하고 거기에 사용 :

프로젝트가 성공적으로 작성되었습니다. 뭐가 문제 야?

+0

어떤 컴파일러를 사용하고 있습니까? 나는 pHelper가 null 인 것으로 의심하고 있습니다. 그게 무슨 일 이냐 ... –

+0

@Nathan Monteleone 죄송합니다, 옆으로부터 오류를 발견하셨습니다. 아니, 그건 널이 아니야. –

+0

'프로젝트가 성공적으로 완료되었습니다. 질문을하는 사람들이 왜이 줄을 가져 오는가? 프로젝트가 정상적으로 빌드 되었기 때문에 ok가 실행되는 것은 아닙니다. 둘째, 어떤 디버깅을 했습니까? 셋째, 프로그램 규모가 크기 때문에 게시하지 않은 코드로 문제가 시작되었다고 판단 할 수 있습니다. – 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; 그것은 분명히 null이 아닙니다. –

+0

와우, 나는 그것을 보지 못했습니다. –

관련 문제