У меня есть класс, содержащий много членов простого типа класса.Что еще более важно, их число растет, поскольку я продолжаю развитие.
Мне нужно иметь возможность сбросить их все сразу, и я бы хотел сделать это без их копирования.Код в настоящее время выглядит следующим образом:
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.
}
Очевидно, что мне не нравится добавлять каждый новый элемент в функцию reset()
(только что произошла ошибка сегмента для того, чтобы забыть один).
Что я собираюсь сделать, это собрать их все в структуру и выделить эту структуру в auto_ptr
.Таким образом, код будет выглядеть следующим образом:
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;
};
Объекты DbProxy не предназначены для копирования или создания копии, хотя я не удосужился обеспечить это, сделав назначение и copy-ctor закрытым.
Видите ли вы какие-либо проблемы с этим подходом?Есть ли у вас другие предложения?
РЕДАКТИРОВАТЬ
на основе предложения @DeadMG, что по этому поводу:
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];
};