如何在c++和Google测试中测试一个虚纯函数

How to test a vitual pure function in C++ and Google Test?

本文关键字:测试 一个 函数 c++ Google      更新时间:2023-10-16

按要求编辑,例如:

我被卡住了:

我需要在谷歌测试测试一个虚拟纯函数,我不能让它工作。我一直在夹具"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;
};

and my 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

我知道这和我的虚函数有关,但是我不知道是什么

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

链接器错误指向丢失的虚函数表是因为您声明了派生类的析构函数,但没有定义它。看起来派生类不需要在析构函数中做任何事情,因此只需删除声明~ReferenceTest();