編輯的要求,E.1:如何在C++和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
我知道這與我的虛擬功能有關,但我不知道是什麼。
我也沒有看到它。你確定錯誤是指'克隆'(你似乎是重寫)而不是'reqReferenceFormate'(你顯然不是)? – 2013-04-09 01:52:17