如何在C ++和Google Test中测试虚拟纯函数?

时间:2013-04-09 01:31:32

标签: c++ googletest

按要求编辑,e.1:

我坚持这个:

我需要在Google Test中测试一个虚拟的纯函数,但我无法让它工作。我一直在灯具中得到这个错误" ReferenceTest a:" :类型' ReferenceTest'必须实现继承的纯虚方法' Bibli :: Reference :: clone'。这个错误可能是微不足道的,但我只是没有看到它。

感谢您的帮助。

#include <gtest/gtest.h>
#include <Date.h> 
#include <Reference.h>
#include <iostream>
#include <sstream>
#include <fstream>

using namespace Bibli;

//********************IMPLANTATION D'UNE CLASSE CONCRETE***********************

class ReferenceTest: public Reference {

public:
ReferenceTest(const std::string& p_cote,
        const std::string& p_theme,
        const std::string& p_titre,
        const std::string& p_auteurs,
        int p_anneeEdition,
        const util::Date& p_dateAcquisition)
:
Reference(p_cote, p_theme, p_titre, p_auteurs, p_anneeEdition, p_dateAcquisition)
{}; //instancier un objet Reference

ReferenceTest(std::istream& p_is)
:
    Reference(p_is)
{};

virtual void afficher(std::ostream& os) const
{}; // Doit être implantée car la classe est concrète


virtual std::string reqReferenceFormate() const
{
    return Reference::reqReferenceFormate();
};

virtual Reference* clone() const
{
    //return new ReferenceTest(*this);
    return 0;
};

~ReferenceTest();

};

//*********************************FIXTURES************************************

//*****************************************************************************
//  Fixture UneReference pour la création d'un objet Reference afin d'instancier
//  une Reference de test
// ****************************************************************************

class UneReference : public ::testing::Test
{
public:

UneReference()
:
    a("121a", "Informatique", "A Book of Jokes", "Mister Faynman", 2005, util::Date(8, 4, 2013))
{};

ReferenceTest a;

};

和我的Reference.h:

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <sstream>
#include <string>

#include "ContratException.h"
#include "ValidationFormat.h"
#include "Date.h"

namespace Bibli
{
class Reference
{
private:
        std::string m_cote;
        std::string m_theme;
        std::string m_titre;
        std::string m_auteurs;
        int m_anneeEdition;
        util::Date m_dateAcquisition;
        void verifieInvariant() const;
public:
// Constructeur
Reference(
const std::string& p_cote,
const std::string& p_theme,
const std::string& p_titre,
const std::string& p_auteurs,
int p_anneeEdition,
const util::Date& p_dateAcquisition);

virtual ~Reference(){};

//Constructeur avec flux d'entrée de la classe. On construit un objet Reference à partir
//de données provenant d'un flux d'entrée. Toutes les données sont supposées valides.
Reference(std::istream& p_is);

bool operator ==(const Reference& uneReference);

virtual std::string reqReferenceFormate() const = 0;
//Le fait de mettre = 0; déclare cette fonction comme étant pur.
//On ne peut plus créer d'objet de cette classe.

virtual Reference* clone() const = 0; //IMPORTANT DE METTRE FONCTIONNEL PLUS TARD

// Fonction d'acquisition des données
//! \fn inline std::string reqCote() const
//! \brief Méthode d'accès au données
//! \return m_cote
inline std::string reqCote() const
{
    return m_cote;
}
//! \fn inline std::string reqTheme() const
//! \brief Méthode d'accès aux données
//! \return m_theme
inline std::string reqTheme() const
{
    return m_theme;
}
//! \fn inline std::string reqTitre() const
//! \brief Méthode d'accès au données
//! \return m_titre
inline std::string reqTitre() const
{
    return m_titre;
}
//! \fn inline std::string reqAuteurs() const
//! \brief Methode d'acces au donnees
//! \return m_auteurs
inline std::string reqAuteurs() const
{
    return m_auteurs;
}
//! \fn inline int reqAnneeEdition() const
//! \brief M√ethode d'acces aux donnees
//! \return m_anneeEdition
inline int reqAnneeEdition() const
{
    return m_anneeEdition;
}
//! \fn inline std::string reqDateAcquisition() const
//! \brief Méthode d'accès au données
//! \return m_dateAcquisition
inline util::Date reqDateAcquisition() const
{
    return m_dateAcquisition;
}
//! \fn inline void asgTheme(const std::string& p_theme)
//! \param[in] p_theme Recoit la nouvelle valeur du theme
//! \brief Change la valeur du thème
inline void asgTheme(const std::string& p_theme)
{
    m_theme = p_theme;
}
};
}//----namespace Bibli

源代码编译得很好,它适用于主应用程序。但每次我在测试中都有ReferenceTest:

ReferenceTest a = ReferenceTest(p_cote, p_theme, p_titre, p_auteurs, p_anneeEdition, p_dateAcquisition);

在Eclipse中使用此错误消息加下划线:

The type 'ReferenceTest' must implement the inherited pure virtual method 'Bibli::Reference::clone'

现在,编译器给了我这个错误:

"vtable for ReferenceTest", referenced from:
  ReferenceTest::ReferenceTest(std::basic_istream<char, std::char_traits<char> >&)in ReferenceTesteur.o

ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [TestReference.exe] Error 1

我知道这与我的虚拟功能有关,但我不知道是什么。

1 个答案:

答案 0 :(得分:2)

您更新的问题表明“必须实现继承的纯虚方法”错误是IDE生成的虚假消息,而不是编译器错误。由于第二个错误来自链接器,因此在成功编译之后,这可能不是真正的错误。我担心我无法帮你修复IDE的错误检测。

引用缺少的vtable的链接器错误是因为您声明但未定义派生类的析构函数。看起来派生类不需要在析构函数中做任何事情,所以只需删除声明~ReferenceTest();