1

C++ でバイナリ ツリーを実装するクラス を作成しておりBTree、Google Test を使用してテストしています。visit()呼び出されるたびに現在のノードからデータを出力する基本クラスへの仮想メソッド を作成しました。

目視検査では、数値が正しい順序で出力されていることがわかります。ただし、これを Google Test で自動的にテストできるようにしたいと考えています。これを行うために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());
}

そして、これは(うまくいけば)基本クラスの関連部分です:

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;
}
4

1 に答える 1

6

を含めていませんconst。それは関数の署名を変更し、オーバーライドするのではなく、基本クラスの署名を非表示にしてしまいます。このため、override関数をオーバーライドするときに追加することをお勧めします。これは、何もオーバーライドしないとコンパイラ エラーが発生するためです (ただし、C++11 はその関数のみです)。次のように変更します。

virtual void visit() const /*override*/ {
//^^optional, especially with the override
于 2013-05-23T04:24:29.067 に答える