2013-04-09 33 views
2

編輯的要求,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 

我知道這與我的虛擬功能有關,但我不知道是什麼。

+1

我也沒有看到它。你確定錯誤是指'克隆'(你似乎是重寫)而不是'reqReferenceFormate'(你顯然不是)? – 2013-04-09 01:52:17

回答

2

您的更新問題表明「必須實現繼承的純虛方法」錯誤是由IDE生成的虛假消息,而不是編譯器錯誤。由於第二個錯誤來自鏈接器,編譯成功後,這不會是一個真正的錯誤。恐怕我無法幫助您解決IDE的錯誤檢測問題。

引用缺少的vtable的鏈接器錯誤是因爲您聲明但未定義派生類的析構函數。它看起來像派生類不需要在其析構函數中做任何事情,所以只需刪除聲明~ReferenceTest();

+0

謝謝Mike。析構函數確實是不必要的,鏈接器錯誤與Google測試所需的一些庫和變量(pthread,gtest,gtest_main)有關。他們在Eclipse配置中的路徑和符號屬性中缺失。 – RastaqWhere 2013-04-10 20:22:16

相關問題