Je ne suis pas un expert en C++ et je n'ai toujours pas une bonne compréhension intuitive de la façon dont les choses fonctionnent. Je pense que c'est une question simple. J'ai du mal à passer des objets avec l'état à d'autres objets. Je préférerais éviter de passer des pointeurs ou des références, car une fois que les objets initialisés sont configurés, je les appelle des millions de fois dans une boucle serrée. Je pense que je suis un peu comme un modèle de commande. Voici le coeur du problème. Mon code d'en-tête est quelque chose comme:Simple Question: Passer l'objet avec l'état, C++
class ObjectWithState {
public:
ObjectWithState(int state) { // This constructor creates the problem!
state_ = state; // everyting works with no constructor.
}
private:
int state_;
};
class TakesObject {
public:
TakesObject(ObjectWithState obj) {
obj_ = obj;
}
private:
ObjectWithState obj_;
};
Mes fonctions main()
ressemble:
int main() {
ObjectWithState some_object(1);
TakesObject takes_object(some_object);
return 0
}
Je reçois l'erreur suivante (g ++):
test.h: In constructor 'TakesObject::TakesObject(ObjectWithState)':
test.h:14: error: no matching function for call to 'ObjectWithState::ObjectWithState()'
test.h:5: note: candidates are: ObjectWithState::ObjectWithState(int)
test.h:3: note: ObjectWithState::ObjectWithState(const ObjectWithState&)
Réponse simple?
Je ne sais pas si cela a à voir avec les constructeurs de copie. Si c'est le cas, j'essaie de trouver une solution qui garde la définition de classe de ObjectWithState très propre et courte. Les utilisateurs de cette bibliothèque définiront de nombreuses petites fonctions comme celle qui sera utilisée par la fonction TakesObject. Idéalement, les programmeurs de ObjectsWithState doivent simplement se concentrer sur l'implémentation d'un objet simple. Peut-être que je errantes ...
Bonne réponse, mais il n'a pas besoin de déclarer un constructeur de copie. Le constructeur de copie par défaut est adéquat. – rlbond
Il doit déclarer le constructeur de copie - une fois qu'il a déclaré ObjectWithState (int), le constructeur de copie par défaut a été perdu. –
ObjectWithState() {} ObjectWithState(int state) { state_ = state; }
Semble fonctionner. Utiliser la liste d'initialisation nécessite aussi le constructeur const, je pense. Un moyen de simplifier l'ObjectWithState? – Tristan