単純なクラス型の多くのメンバーを含むクラスがあります。さらに重要なことは、私が開発を進めるにつれて、その数が増えていることです。
それらをすべて一度にリセットできるようにする必要があり、それらをコピーして貼り付けずに実行したいと考えています。コードは現在次のようになっています。
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()
(1 つを忘れたというセグメント障害がありました)。
私がやろうとしているのは、それらをすべて構造体にまとめて、この構造体を の下に配置すること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];
};