J'ai une classe contenant plusieurs membres d'un type de classe simple. Plus important encore, leur nombre augmente au fur et à mesure du développement.comment réinitialiser un grand nombre de membres de la classe à la fois, pas dans un destructeur?
Je dois être en mesure de les réinitialiser tous en même temps, et je voudrais le faire sans copier-coller. Le code ressemble actuellement:
typedef auto_ptr<odbc::PreparedStatement> Stmt;
class DbProxy {
private:
void reset();
Stmt a;
Stmt b;
Stmt c;
// ... about 10 more
};
void DbProxy::reset()
{
a.reset();
b.reset();
c.reset();
// etc.
}
Il est évident que je n'aime pas avoir à ajouter chaque nouveau membre à la fonction reset()
(juste eu une faute seg pour oublier un.).
Ce que j'ai l'intention de faire est de les rassembler tous dans une structure et d'allouer cette structure sous auto_ptr
. Ainsi, le code ressemblerait à ceci:
typedef auto_ptr<odbc::PreparedStatement> Stmt;
class DbProxy {
public:
DbProxy(): stmts(new OdbcResources) {}
private:
void reset() { stmts.reset(); }
struct OdbcResources {
Stmt a;
Stmt b;
Stmt c;
// ... about 10 more
};
auto_ptr<OdbcResources> stmts;
};
objets de DbProxy ne sont pas destinés à être copiés ou copie construite, bien que je ne l'ai pas pris la peine d'en assurer en faisant la cession et la copie-cteur privé.
Voyez-vous un problème avec cette approche? Avez-vous d'autres suggestions?
EDIT
basée sur la suggestion @DeadMG, qu'en ceci:
class DbProxy {
public:
DbProxy();
private:
enum Statements { SELECT1, SELECT2, INSERT, LAST }; // never mind the names
void reset() { for (int i=0; i < LAST; i++) statement[i].reset(); }
Stmt statements[LAST];
};
Pouvez-vous mettre vos objets 'Stmt' dans un tableau? De cette façon, vous pouvez gérer n'importe quel nombre arbitraire d'entre eux. –
pourquoi pas un conteneur d'objets 'shared_ptr <>'? – Nim
@Robert, impossible ce sont 'auto_ptr' - qui ne peuvent pas être stockés dans un conteneur – Nim