SORU
5 EKİM 2014, Pazar


Bir `foo int nedir::*bar:*`?

C ile serin bir şey işaretçi üyesi türleri değişkenler oluşturmanızı sağlar. En yaygın kullanım örneği bir yöntem için bir işaretçi gibi görünüyor:

struct foo
{
    int x() { return 5; }
};

int (foo::*ptr)() = &foo::x;
foo myFoo;
cout << (myFoo.*ptr)() << '\n'; // prints "5"

Ancak, oyalanmayı, sadece üye değişkenler noktaya vardım:

struct foo
{
    int y;
};

int foo::*ptr = &foo::y;
foo myFoo;
myFoo.*ptr = 5;
cout << myFoo.y << '\n'; // prints "5"

Bu çok muhteşem. Eğer bir yapının alt üye için bir işaretçi alsanız ne olur? başka bir deney götürdü:

struct foo
{
    int y;
};

struct bar
{
    foo aFoo;
};

int bar::*foo::*ptr;

Bu 23**.

Ancak, bu yararlı bir şey atamak için nasıl hiçbir fikrim yok. Aşağıdaki eser yok:

int bar::*foo::*ptr = &bar::foo::y; // no member named "foo" in "bar"
int bar::*foo::*ptr = &bar::aFoo::y; // no member named "aFoo" in "bar" (??)
int bar::*foo::*ptr = &foo::y; // can't init 'int bar::*foo::*' with 'int foo::*'

Ayrıca, bu oluşturduğu hata göre, bu tür aklımdaki tam olarak bu değil gibi görünüyor:

int bar::*foo::*ptr = nullptr;
bar myBar;
myBar.*ptr = 4; // pointer to member type ‘int bar::*’ incompatible
                // with object type ‘bar’

Bu kavram benden kaçıyor gibi görünüyor. Açıkçası, bu sadece bir yolu beklediğim tamamen farklı ayrıştırılır alır bunu göz ardı edemem.

Herkes int bar::*foo::* aslında ne olduğunu bana açıklayabilir mi? Neden gcc bar üyesi için bir işaretçi bar bir nesne ile uyumsuz olduğunu söyle? Nasıl int bar::*foo::*, bir kullanmalıyım ve nasıl geçerli bir inşa ki?

CEVAP
5 EKİM 2014, Pazar


İşte bir "geçerli" yolu böyle bir canavar başlatılıyor:

struct bar;

struct foo
{
    int y;    
    int bar::* whatever;
};

struct bar
{
    foo aFoo;
};

int bar::* foo::* ptr = &foo::whatever;

Olarak görebiliriz, ptr bir işaretçi üyesi foo (foo::*, soldan sağa), nerede o üyesidir kendisi bir işaretçi üyesi bar (bar::*), nerede o üye bir int.

Nasıl bir int bar kullanırım::* foo::*

Yok, umarım! etmezsin Ama eğer stres altında iseniz, bu deneyin!

struct bar
{
    foo aFoo;

    int really;
};

int bar::* foo::* ptr = &foo::whatever;
foo fleh;
fleh.whatever = &bar::really;
bar blah;
blah.*(fleh.*ptr) = 42;
std::cout << blah.really << std::endl;

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • B3ASTTY™

    B3ASTTY™

    27 Mayıs 2013
  • Bart Baker

    Bart Baker

    1 Aralık 2006
  • Jonnyriddlin1

    Jonnyriddlin

    4 Ocak 2007