2013-03-03 17 views
10

Yani, bir yapıyı tamamen nasıl silebiliriz veya sıfırlayabiliriz diye merak ettim, yeniden kullanılabilir miydi?C++ bir yapının tüm değerlerini tamamen siler (veya sıfırlar)?

sadece burada, bu daktilo gitmek:

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

Bu typedef C'den bir eserdir, burada pek bir şey yapmaz. Ayrıca sadece üyeleri kendi içinde sıfırlayın ya da bunu yapmak için bir yöntem yazın. – Rapptz

+0

Teşekkürler, bunu bilmiyordum. – user2117427

+0

Jeez, herkes neden bu kadar aşağı çekilmekten mutlu oluyor? Bunu 0'a geri alıyorum –

cevap

17

sadece atayabilirsiniz bir inşa kendisine geçici:

Part my_struct; 

my_struct = Part(); // reset 

C++ 11:

my_struct = {}; // reset 
+0

Hmm, bu kötü bir fikir gibi görünmüyor. – user2117427

+0

@ user2117427 çalışması için, – Slava

+0

Yapılarınızda doğru varsayılan kurucuya ihtiyacınız var Evet, üzerinde çalışıyorum: P – user2117427

5

Bir sebepten ötürü aynı nesneyi sürekli olarak tutmak üzereydim, hepsini sıfırlayabilen bir reset metodu yazardım. değerleri ne olduklarına geri. Buna benzer

şey:

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

Evet, şu an yapıyorum. :) + 1 – user2117427

+0

Anonim downvoter, lütfen açıklar mısınız? : | – Rapptz

+0

@ user2117427 ve hata oluşturmak istemiyorsanız, durmalısınız. En azından ctor'dan reset() çağırın, ancak reset() yöntemini sıfırlayın() – Slava

-1

İyi uygulama (bu arada sıfırlamak sahip, iki farklı semantik anlamları için aynı değişkeni kullanarak) yapısının bu tür kaçınmaktır. Siz (veya başka biri) kodunuzu değiştirdiğinizde ve iki farklı kullanım için bir değişken paylaştığınızı unuttuğunuzda, kaçınılmaz olarak garip bir hata oluşturacaktır.

tek geçerli ancak bazı bellek alanını yedek olacaktır:

  • Gerçekte böyle bir optimizasyona ihtiyaç duyduğunu çok düşüktür.
  • Bunu yapsanız bile, derleyici genellikle yığındaki bir değişkenin artık kullanılmadığını ve atılabileceğini anlar, böylece oluşturduğunuz yeni değişken ilkini etkili bir şekilde değiştirir. Hafızayı kendiniz korumayı önemsemeye gerek yok.
  • Değişkenleriniz yığındaysa, yalnızca iki farklı işaretçiyi kullanmanız daha iyi olur.

Ancak bu sıfırlamayı gerçekten yapmak istiyorsanız, bunu yapmak için bir yöntem yazmanız gerekir. C++ 'da yerleşik bir yol yoktur, çünkü aslında destructor ve daha sonra constructor numaralı telefonu çağırmayı gerektirir.

my_struct = Part() numaralı çözüm, yalnızca destructor numaralı ürününüz önemsiz olduğunda çalışır. std::vector numaranızda işaretçi atadığınızı varsayalım, vector'u boşaltmadan önce her işaretçiyi delete düzgün bir şekilde işaretlemelisiniz. Bu yüzden otomatik olarak yapılamaz: yapının temizlenmesi, basit unutmadan ziyade özel bir tedavi gerektirebilir.

+0

> Sadece my_struct = Part() 'a ilişkin çözüm, yalnızca yıkıcınız önemsiz olduğunda çalışır. Ne? – Slava

+0

-1 için "Bunu yapmak için bir yöntem yazmalısınız" – Slava

+0

Üzgünüm, bir yazım hatası oldu. Neden -1? Örneğin, boost :: shared_ptr'nin nasıl olduğunu düşünüyorsunuz? Bir yıkıcıyı kendiniz aramak istemezsiniz, bu yüzden gördüğüm tek şey bir "reset" yöntemi yazmaktır. – Mic

İlgili konular