googletest - How to test a vitual pure function in C++ and Google Test? -
edited requested, e.1 :
i stuck on :
i need test virtual pure function in google test , cannot work. keep getting error in fixture "referencetest a:" : type 'referencetest' must implement inherited pure virtual method 'bibli::reference::clone'. error may trivial don't see it.
thank help.
#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; };
and 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
the source code compiles fine , works main app. every time have referencetest in tests :
referencetest = referencetest(p_cote, p_theme, p_titre, p_auteurs, p_anneeedition, p_dateacquisition);
it underlined error message in eclipse :
the type 'referencetest' must implement inherited pure virtual method 'bibli::reference::clone'
and compiler, now, gives me error :
"vtable referencetest", referenced from: referencetest::referencetest(std::basic_istream<char, std::char_traits<char> >&)in referencetesteur.o ld: symbol(s) not found architecture x86_64 collect2: ld returned 1 exit status make: *** [testreference.exe] error 1
i know related virtual functions don't know what.
your updated question indicates "must implement inherited pure virtual method" error spurious message generated ide, not compiler error. since second error comes linker, after successful compilation, cannot real error. i'm afraid can't fixing ide's error detection.
the linker error referring missing vtable because declare, don't define, destructor derived class. looks derived class doesn't need in destructor, remove declaration ~referencetest();
Comments
Post a Comment