25

構造を完全に消去またはリセットして、再利用できるようにするにはどうすればよいのでしょうか?

これを入力したところです。

typedef struct PART_STRUCT
{
    unsigned int Id;
    std::string Label;
} Part;

typedef struct OBJECT_STRUCT
{
    std::vector< unsigned char > DBA;
    std::vector< Part > Parts;
    unsigned int Id;
} Object;

Object Engine;

// Initialize all members of Engine
// Do whatever with Engine
// ...
// Erase/Reset Engine value
4

3 に答える 3

47

構築された一時的なものをそれに割り当てることができます:

Part my_struct;

my_struct = Part(); // reset

C++11:

my_struct = {}; // reset
于 2013-03-03T07:27:34.250 に答える
9

なんらかの理由で同じオブジェクトを常に維持することに夢中になっている場合は、resetすべての値を元の値にリセットするメソッドを作成するだけです。

これに似たもの:

struct Test {
    int a;
    int b;
    Test(): a(0), b(100) {}
    void reset() {
        a = 0;
        b = 100;
    }
};

int main() {
    Test test;
    //do stuff with test
    test.reset(); //reset test
}
于 2013-03-03T07:39:50.340 に答える
-1

そのタイプの構成を回避することをお勧めします(2つの異なるセマンティクスの意味に同じ変数を使用し、その間にリセットします)。後であなた(または他の誰か)がコードを変更し、2つの異なる用途のために変数を共有したことを忘れると、必然的に奇妙なバグが発生します。

唯一の正当化は、メモリスペースをいくらか節約することですが、次のようになります。

  • 実際にそのような最適化が必要になる可能性はほとんどありません。
  • そうした場合でも、コンパイラは通常、スタック上の変数が使用されなくなって破棄できることを認識します。したがって、作成する新しい変数が最初の変数を効果的に置き換えます。自分でメモリを節約することを気にする必要はありません。
  • 変数がヒープ上にある場合は、2つの異なるポインターを使用する方がよいでしょう。

しかし、本当にこのリセットを実行したい場合は、それを実行するメソッドを作成する必要があります。C ++には組み込みの方法はありません。これは、実際には、を呼び出してdestructorからconstructorもう一度呼び出す必要があるためです。

解決策my_struct = Part()は、あなたdestructorが些細な場合にのみ機能します。にポインタを割り当てたとしましょう。を空にする前に、すべてのポインタstd::vectorを適切に割り当てる必要があります。そのため、自動的に実行することはできません。構造のクリーンアップには、単純な忘却ではなく、特別な処理が必要になる場合があります。deletevector

于 2013-03-03T07:40:01.147 に答える