如何在c++和Google测试中测试一个虚纯函数
How to test a vitual pure function in C++ and 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;
};
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();
相关文章:
- C++多态性:如何测试一个类是否派生自另一个基类
- 单元测试一个变量的true和false
- 测试一个数字是否具有小数值,而没有任何库
- 有没有一种方法可以测试一个输入是否是C++中的数字
- 如何使用switch语句(C++)测试一个数字是素数还是可被7整除
- 我如何测试一个调用是在谷歌测试延迟后使用嘲讽框架进行的
- 谷歌模拟测试一个类的真实行为
- 测试一个操作在Qt中花费多少时间的最简单方法
- 使用不同的函数(C++)测试一个数字是否是回文
- 测试一个图是否是树
- 如何(单元)测试一个函数是否无锁
- 如何测试一个序列是否符合给定模式中的另一个序列
- 用Qt测试一个本地连接
- 测试一个简单的链表,但它坚持向后迭代
- 如何测试一个std::线程是否从
- 如何在c++和Google测试中测试一个虚纯函数
- 测试一个方法的私有成员是否依赖于时钟时间
- 测试一个向量的所有元素是否相等
- 基准测试一个纯C++函数
- 为什么这个特性类不起作用,来测试一个类是否有某个typedef