2013-05-23 2 views
1

C++에서 이진 트리를 구현하기 위해 BTree 클래스를 작성 중이며이를 테스트하기 위해 Google 테스트를 사용하고 있습니다. 가상 메소드 인 visit()을 생성하여 기본 노드에서 호출 할 때마다 현재 노드의 데이터를 인쇄합니다.가상 메서드가 호출되지 않았습니다.

육안 검사를 통해 번호가 올바른 순서로 출력됨을 알 수 있습니다. 그러나 Google 테스트를 통해 자동으로 테스트 할 수 있기를 바랍니다. 이를 위해 서브 클래스 InOrderTest을 작성하여 visit() 메소드를 대체하므로 인쇄하는 대신 문자열에 추가합니다. 그러나 하위 클래스 대신 기본 클래스 버전이 호출되고 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

이 테스트 케이스이다 :

TEST_F(BTreeTestSuite, inOrder) 
{ 
    class InOrderTest : public BTree 
    { 
    public: 
     InOrderTest(int data) throw(int) : BTree(data), itsVisitString() {}; 
     std::string visitString(void) const { return itsVisitString; } 
     virtual void visit() 
     { 
      std::ostringstream oss; 
      oss << itsData; 
      itsVisitString += oss.str(); 
      std::cerr << "vs1: " << itsVisitString << '|' << std::endl; 
      itsVisitString += " "; 
      std::cerr << "vs2: " << itsVisitString << '|' << std::endl; 
     } 
    private: 
     std::string itsVisitString; 
    }; 
    InOrderTest iot(20); 
    iot.insert(30); 
    iot.insert(15); 
    iot.insert(10); 
    iot.inOrder(); 
    EXPECT_STREQ("10 15 20 30 ", iot.visitString().c_str()); 
} 

그리고 이것은 기본 클래스의 (희망) 관련 부분입니다 : 당신은 const을 포함하지 않는

class BTree 
{ 
public: 
    BTree(int data) throw(); // constructor(s) 
    ~BTree() throw();  // destructor 

    void insert(int data); 
    unsigned count() const; 
    void inOrder() const; 

    int data() const throw() { return itsData; }; 
    BTree *left() const throw() { return itsLeft; }; 
    BTree *right() const throw() { return itsRight; }; 
protected: 
    virtual void visit() const; 
    int itsData; 
private: 
    // Don't allow creation of BTree without data 
    BTree() throw(); // constructor(s) 
    BTree *itsLeft; 
    BTree *itsRight; 
protected: 
}; 
... 
void BTree::inOrder() const 
{ 
    if (itsLeft) itsLeft->inOrder(); 
    visit(); 
    if (itsRight) itsRight->inOrder(); 
} 

void BTree::visit() const 
{ 
    cout << itsData << endl; 
} 

답변

6

. 그것은 함수의 시그니처를 변경하고 그것을 오버라이드하지 않고 기본 클래스에 숨긴다. 이 이유 때문에 함수를 재정의 할 때 override을 추가하는 것이 좋습니다. 아무 것도 재정의하지 않으면 컴파일러 오류가 발생하기 때문입니다 (C++ 11 만 해당). 변경 :

virtual void visit() const /*override*/ { 
//^^optional, especially with the override 
+0

무료! 그거였다! 최소한 대답을 얻는 데 2 ​​분 밖에 걸리지 않았습니다. –

+0

이제 또 다른 문제가 있습니다. 삽입 코드는 기본 클래스에만 있으므로 첫 번째 노드 만 하위 클래스입니다. 나머지는 모두 기본 클래스이므로'visit()'메서드는 하위 클래스에서 한 번만 호출됩니다. 이 문제를 해결하는 방법을 정말로 모르겠습니다. 'insert()'메소드 로직은 기본 클래스 대신에 파생 클래스를 삽입해야한다는 것을 제외하고는 작동합니다. 그리고 어떻게 해야할지 모르겠습니다. 나는'insert()'메소드를 가상으로 만들고 오버라이드 할 수 있지만 서브 클래스에서 모든 로직을 다시 복제하고 싶지는 않습니다. –

+0

@StephenRasku, 아마 별개의 질문으로 더 좋을 것입니다. – chris

관련 문제