2010-09-13 16 views
2

Je veux simuler une méthode avec la déclaration A::B X(void). La définition est quelque chose comme suit.Comment se moquer d'une fonction avec la signature `object()`

class A { 
    class B; 
    virtual B X() = 0; 
}; 

class A::B { 
    public: 
    auto_ptr<int> something; 
}; 

Ma classe mock, par la suite, est assez standard.

class mA : public A 
{ 
    public: 
    MOCK_METHOD0(X, A::B()); 
}; 

Compilé, cependant, cela me donne cette erreur weirdo, et je n'ai pas été capable de le suivre vers le bas. Quel est le probleme avec ca?

In member function ‘virtual A::B mA::X()’: 
...: error: no matching function for call to ‘A::B::B(A::B)’ 
...: note: candidates are: A::B::B() 
...:      A::B::B(A::B&) 

Mise à jour J'ai trouvé un exemple de code à défaut de démontrer.

#include <gmock/gmock.h> 
#include <memory> 
using std::auto_ptr; 

class thing { 
    public: 
    class result; 
    virtual result accessor() = 0; 
}; 

class thing::result { 
    auto_ptr<int> x; // If this just "int", error goes away. 
}; 

namespace mock { 
    class thing : ::thing { 
     public: 
     MOCK_METHOD0 (accessor, result()); 
    }; 
} 
+0

Et la définition de 'MOCK_METHOD0',' A', 'B', et' X' sont ...? – GManNickG

+0

'MOCK_METHOD0' est donné par Google Mock, ici: http://code.google.com/p/googlemock/wiki/CheatSheet#Mocking_a_Normal_Class –

+0

Je n'ai pas été en mesure de reproduire cela sur un petit extrait de code, bien qu'ils suivent tous les modèles normaux pour Google Mock. Je vais donner un croquis de A, B et X ici. –

Répondre

4

Il est difficile de dire sans les définitions de A et B. sonne comme il tente de construire un B d'un temporaire et à défaut, car il ne peut pas lier le temporaire à une référence non-const.

Par exemple, votre constructeur de copie peut être définie comme:

class A { 
public: 
    class B { 
    public: 
    // This should be const, without good reason to make it otherwise. 
    B(B&); 
    }; 
}; 

Avec la solution juste faire une référence const.

+0

Hmm, je ne définis pas le constructeur de copie, mais peut-être ... cela serait-il affecté par les membres internes de la classe? 'auto_ptr', par exemple? –

+3

Absolument, auto_ptr a un constructeur de copie non const, et force B à avoir un constructeur de copie non-const. –

+0

En tant que correctif, vous devez considérer ce que vous voulez faire avec ce pointeur dans le cas de copie; Utilisez un pointeur partagé si vous voulez que la copie partage l'accès entre les classes (probablement seulement si l'objet pointé est immuable), ou écrivez votre constructeur de copie copie qui clone quel que soit l'objet (ou les deux) l'objet n'est pas polissable et change autour de l'interface de A pour passer un handle à B à la place. –