2015-12-03 34 views
7

Bir şekilde sendikanın mirasını kullanmanın mümkün olup olmadığını bilen var mı diye merak ediyordum. TestWorks çalışır iken Bir birlik içinde mirasın kullanılması

Aşağıdaki örnekte, TestFails birlik, Base yapı içinde a değişken içermeyecektir.

struct Base { int a; }; 

union TestFails 
{ 
    struct : public Base {}; 
    int b; 
}; 

union TestWorks 
{ 
    struct { int a; }; 
    int b; 
}; 

int main() 
{ 
    TestWorks works; 
    works.a = 0; 

    TestFails fails; 
    fails.a = 0; 

    return 0; 
} 

Burada kodu test edebilirsiniz: o yardımcı olur http://ideone.com/dUzpOR

+0

Merakla, neden bunu istiyorsun? – Cameron

+0

Birkaç içerik toplamaya ihtiyaç duyan birkaç sendika var, hangi içerikler oldukça benzer, bu yüzden yeniden kullanabileceğim bazı temel veri yapılarına sahip olmayı umuyorum. – Artoo

+0

FWIW, bu sendikalar için özel görünmüyor: http://ideone.com/9VGAkz – immibis

cevap

0

emin değil eğer, ancak bu çalışır: Her şeyden

struct Base { int a; }; 
struct Foo : Base { int b;}; 
union TestFailsNot { 
    Base base; 
    Foo foo; 
    int b; 
}; 

int main() { 
    TestFailsNot failsNot; 
    failsNot.foo.a = 0;  
    failsNot.base.a = 3; // maybe not what you want to do, but it works 
} 
+0

@Cameron cevabı güncelledi – user463035818

1

İlk - varsayımınızı TestWorks eserler yanlış olduğunu. Bunun için sadece uzantısı - - Bu ++ standart C değil o unnamed anonymous struct denir - ve bilgiçlik taslayan seçeneklerle derlemek aldığınız:

prog.cc:5:27: error: ISO C++ prohibits anonymous structs [-Wpedantic]
struct : public Base {};

     ^

prog.cc:11:22: error: ISO C++ prohibits anonymous structs [-Wpedantic]
struct { int a; };

Sorununuzu çözmek için - sadece bu anonim yapılar isim :

union TestFails 
{ 
    struct : public Base {} s; 
    //     ^
    int b; 
}; 

union TestWorks 
{ 
    struct { int a; } s; 
    //    ^
    int b; 
}; 
+0

Anonim yapıların standart olmadığını biliyordum, ama yukarıda yaptığım yorumlar uyarınca kaçınmaya çalıştığım tam olarak buydu. Yine de yardımın için teşekkürler. – Artoo

1

Cevap hayır. C++ 'da çok fazla karanlık köşesi var ama bunlardan biri değil :)

sınıfları ve yapıları kalıtım var. sendikalar yapmazlar.

çalıştığınız neyi başarmak için tek yol ... (onlara kamu ilan etmeye gerek yoktur bu yüzden onlar varsayılan bir kamu kapsamı var çünkü sadece yapılar, demek)

yapılar için sendikanızı planı ayrı olan Birliğinize bir yapı yerleştirmeye çalışırsanız, değerine erişmek için yeni yapının ekstra kapsamını eklemeniz gerekir.

AndyG cevabı bu gösteriyor Tam olarak:

union TestFails 
{ 
    struct foo: public Base {}; 
    foo f; 
    int b; 
}; 

TestFails fails; 
fails.f.a = 42; 
std::cout << fails.f.a << std::endl; 

adlı bir değişken ihmal ve bunların amacı olan (bazen daha sonra ad ile yapılır veri dışarıdan erişilemez isimsiz kapsamını oluşturursanız ilk etapta)

+0

Sendikalar mirası burada tartışılmıyor, miras, bir sendikadaki bir yapıyı etkiliyor, ki farkında olduğum sürece tamamen farklı bir konu. Lütfen çözümünüzü ad alanlarını kullanarak genişletir misiniz? – Artoo

+1

Sendik mirasın sizin sorunuz olmadığını anlıyorum, ancak amacınızı gerçekleştirmenin tek yolu miras. Bir yapıya tekrar girerek, sendikanızdaki 1 numaralı seviyeye erişebileceksiniz, böylece sadece değere "f.s.a" yerine "f.a" şeklinde erişebilirsiniz. Bu, şu an '' a '' ilişkisine karşılık gelir '' şu andan itibaren var olan bir ilişkiniz var ' – Dan

+0

İsimsiz ad alanlarına ilişkin nokta, anonim/adsız başka bir şeyle birlikte gider. Dışarıdan erişilemezler veya geçici değildirler. – Dan

İlgili konular