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
İş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;
PHP var_dump veya print_r JavaScript k...
Durum=Chrome Geliştirici Araçları, kay...
Scala içinde JavaConverters ve JavaCon...
Arasındaki farklar anket ve seçmek ned...
Python 100.000 HTTP istekleri gönderme...