按要求编辑,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
我知道这与我的虚拟功能有关,但我不知道是什么。
答案 0 :(得分:2)
您更新的问题表明“必须实现继承的纯虚方法”错误是IDE生成的虚假消息,而不是编译器错误。由于第二个错误来自链接器,因此在成功编译之后,这可能不是真正的错误。我担心我无法帮你修复IDE的错误检测。
引用缺少的vtable的链接器错误是因为您声明但未定义派生类的析构函数。看起来派生类不需要在析构函数中做任何事情,所以只需删除声明~ReferenceTest();