1

単純なクラス型の多くのメンバーを含むクラスがあります。さらに重要なことは、私が開発を進めるにつれて、その数が増えていることです。

それらをすべて一度にリセットできるようにする必要があり、それらをコピーして貼り付けずに実行したいと考えています。コードは現在次のようになっています。

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];
};
4

5 に答える 5

3

静的サイズの配列を使用します。

Stmt statements[10];

for(int i = 0; i < sizeof(statements) / sizeof(Stmt); i++)
    statements[i].reset();
于 2011-01-10T16:21:34.127 に答える
2

余分なものは必要ありませんauto_ptr(それぞれStmtauto_ptrとにかくです)。単一のクラスでそれらを収集すると、簡単な割り当てでそれらをリセットできます。配列ソリューションとは異なり、意味のある名前を保持します。

生成されたコピー割り当て演算子は非参照stmts = OdbcResources();を取るため、名前のない一時的なもの (例: ) は使用できないことに注意してください。constauto_ptrconst auto_ptr

class DbProxy {
public:
  DbProxy() : stmts() {}
private:
  void reset() { OdbcResources tmp; stmts = tmp; }

  struct OdbcResources {
    Stmt a;
    Stmt b;
    Stmt c;
    // ... about 10 more
  };
  OdbcResources stmts;
};
于 2011-01-10T17:35:23.143 に答える
1

これはコンテナを求めています -odbc::PreparedStatementコピー可能であると仮定して、単にこれらのベクトルをDbProxy

class DbProxy {
private:
  void reset() { resources.clear(); } // all vanish!

  vector<odbc::PreparedStatement> resources;
};

そうしないと、shared_ptr

typedef shared_ptr<odbc::PreparedStatement> Stmt;
class DbProxy {
private:
  void reset() { resources.clear(); } // all vanish!

  vector<Stmt> resources;
};
于 2011-01-10T16:27:31.863 に答える
1

このタイプのアプローチには何の問題もありません。これは、「プライベート実装」イディオムのように見えます。詳細に興味を持つことができます。

my2c

于 2011-01-10T16:35:04.907 に答える
0

デフォルトのコピーを単純にコピーできる場合があります。

void reset() { *this = DbProxy(); }
于 2011-01-10T16:28:55.130 に答える