2011-01-10 7 views
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()関数にすべての新しいメンバーを追加する必要が好きではない:コードは、現在のように見えます。

私がしようとしているのは、それらをすべて構造に集めて、この構造をauto_ptrの下に割り当てることです。だから、コードは次のようになります。私は割り当てとコピーCTORのプライベートを作ることによって、これを確実にするために気にしませんでしたが、DbProxyの

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

オブジェクトは、コピーまたはコピーを構築することを意図していません。

この方法に問題はありますか?あなたは他の提案がありますか? @DeadMGの提案に基づいて

EDIT

、何これについて:

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]; 
}; 
+0

'Stmt'オブジェクトを配列に配置できますか?あなたはそれらの任意の数を処理することができますその方法。 –

+0

なぜ 'shared_ptr <>'オブジェクトのコンテナではありませんか? – Nim

+0

@Robert、これは可能ではありません。 'auto_ptr'はコンテナに格納できません。 – Nim

答えて

2

余分auto_ptrの必要は(各Stmtはとにかくauto_ptrある)ありませんあなたは、単一のクラスでそれらを収集する場合は、単純な代入でそれらをリセットすることができます。アレイソリューションとは異なり、依然として意味のある名前が保持されます。生成されたコピー代入演算子は、メンバー(auto_ptr)などの非const基準を取るように、あなたが(例えばstmts = OdbcResources();)名前一時的に使用できません

auto_ptrconst非sから割り当てることができません。

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; 
}; 
+0

これはおそらく最も簡単な解決策です。あなたは無名の一時的なものについて、2番目の点を詳述できますか? – davka

+2

@davka:コピー代入演算子で非コンス( 'コンス ')参照を取る' auto_ptr'のためにメンバーワイド割り当てが失敗するため、コンパイラは 'OdbcResources&operator =(const OdbcResources&)'というシグネチャを持つコピー代入演算子を生成できません。コンパイラは、署名 'OdbcResources&operator =(OdbcResources&)'を持つコピー代入演算子を生成する必要があります。一時的ではない 'コンス'参照にバインドすることはできないので、 'stmts = OdbcResources()'はコンパイルされません。 –

+0

ありがとう、それは今では明らかです – davka

3

静的なサイズの配列を使用してください。

Stmt statements[10]; 

for(int i = 0; i < sizeof(statements)/sizeof(Stmt); i++) 
    statements[i].reset(); 
+0

ありがとう、それは私に起こったが、そこに問題がある - 現在彼らはそれぞれ意味のある名前を持っており、DbProxyクラスによって提供される様々なメソッドで使用されています。配列では、 'insertStmt'ではなく' statements [3] 'で参照しなければなりません。これはエラーや混乱を招く可能性があります。 – davka

+0

これはおそらくenumを使用できますか?私のOP – davka

+0

の編集を参照してください@davka:あなたはちょうど小さなヘルパー機能を作ることができます。 'StmtとGetInsertStmt(){return文[3]; } '。列挙型も仕事をします。 'enum {InsertStmt = 0、UpdateStmt = 1};'列挙型を配列のインデックスとして直接渡すことができます。 – Puppy

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; 
}; 
+0

ありがとう。私が使っているライブラリ(odbC++)は 'odbc :: PreparedStatement'へのポインタしか与えていないので、最初のオプションは使えません。しかし、第二は面白いです。 – davka

+0

あなたのライブラリが 'odbc :: PreparedStatement'の所有権をあなたに譲渡しない場合、' shared_ptr'とライブラリの両方が所有権を持っていると考えられるため、2番目のライブラリも動作しません。 –

+0

@マークB:わからない - それらのサンプルは、スコープから外れるときにポインタを削除する 'auto_ptr'を使用しているので、私はそれらが所有権を移譲すると仮定します(並べ替え、ステートメントを使用/削除しようとするとseg。faultが発生するので、共有所有権のように見えます...) – davka

0

にこれらのベクトルを持っています単純にデフォルトのコピーでコピーしてください:

void reset() { *this = DbProxy(); } 
+0

これは興味深いですが、少し残酷に見えますか?とにかく、私はクラス**には何も持っていないと仮定していますが、**それらのステートメントです。 – davka

+0

はい、しかし、 'stmts.reset(new OdbcResources);'は、プリペアドステートメントをデフォルトの構成アイテムにリセットするだけですか? –

+0

@マークB:はい、これは良いです – davka

1

私はこのタイプのアプローチに間違いはありません。 "Private Implementation"イディオムのように見えます。 detailsに興味があります。

MY2C

関連する問題