Question

Je suis en train de mettre en place un système où GUI objets qui dérivent d'une classe de GuiObject peut enregistrer un sérialiseur et désérialiseur afin qu'ils puissent être sérialisé / désérialisé à / à partir d'un fichier XML basé uniquement sur un alias de classe. Par exemple:

class Button : public GuiObject
{
    // ...
};

Button pourrait ressembler à ceci en XML:

<button>
    [...]
</button>

L'idée est que le code client peut enregistrer un sérialiseur et désérialiseur pour un dérivé de GuiObject, en utilisant un espace réservé pour l'objet pour appeler la fonction sur :

typedef boost::function<void(ticpp::Element*)> serialisation_function;

// ...

serialisation_function serialiserFunc(boost::bind(&Button::WriteElement, _1, _2));
GuiObjectXmlSerialiser buttonSerialiser("button", serialiserFunc);
guiObjectXmlFactory.registerSerialiser(buttonSerialiser);

ressemble Button::WriteElement comme:

virtual void WriteElement(ticpp::Element* element) const;

GuiObjectXmlSerialiser.h:

typedef boost::function<void(ticpp::Element*)> serialisation_function;

// Serialises a GuiObject via a creation and serialisation function, storing
// a class name to differentiate it between others.
class GuiObjectXmlSerialiser
{
public:
    GuiObjectXmlSerialiser(const std::string& class_alias,
        serialisation_function serialisation_func);

    void serialise(gui_object_ptr object, ticpp::Element* element);
private:
    std::string class_alias;
    serialisation_function serialisation_func;
};

GuiObjectXmlSerialiser.cpp:

GuiObjectXmlSerialiser::GuiObjectXmlSerialiser(const std::string& class_alias,
serialisation_function serialisation_func)
: class_alias(class_alias)
, serialisation_func(serialisation_func)
{
}

void GuiObjectXmlSerialiser::serialise(gui_object_ptr object, ticpp::Element* element)
{
    serialisation_func(object, element);
}

À l'heure actuelle, je reçois cette erreur à la ligne de serialisation_func(object, element);:

error C2064: term does not evaluate to a function taking 2 arguments

Je voudrais savoir comment retarder le passage dans l'objet d'appeler la fonction de membre sur, en spécifiant l'objet à utiliser en même temps que d'appeler la fonction. Je suis Staring dans ce domaine depuis un certain temps maintenant en vain.

Vive.

Était-ce utile?

La solution

Je peux voir deux erreurs:

Tout d'abord, vous définissez une fonction qui prend un seul argument, mais vous essayez de l'appeler avec deux arguments:

// Single argument of type ticpp::Element*
typedef boost::function<void(ticpp::Element*)> serialisation_function;
// Call with two arguments:
serialisation_func(object, element); 

// You probably meant:
typedef boost::function<void(gui_object_ptr, ticpp::Element*)> serialisation_function;

En second lieu, vous ne prenez pas en compte que votre fonction est une fonction de membre. Cela signifie qu'il prend en fait un troisième paramètre, this (en première position). Vous devriez vérifier si cela doit être une fonction membre ou non, mais je pense qu'il ya une erreur dans votre compréhension.

// From your code I am not sure what [serial_instance] should be.
serialisation_function serialiserFunc(boost::bind(&Button::WriteElement, [serial_instance] , _1, _2));

Autres conseils

Vous devez indiquer copie de classe objet, pour Wich que vous voulez appeler la liaison, lissée comme:

Button* btn = new Button();
serialisation_function serialiserFunc(boost::bind(&Button::WriteElement, btn, _1, _2));

vous pouvez également utiliser un pointeur this, si vous voulez créer pour lier cette copie d'objet de classe

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top