Olası Çoğalt:
operator->()
zincirli olması
Overloading operator ->Operatör-> İşaretçiler için "zincirleme"?
Merhaba,
Ben mesela o değerlendirilir sonra, (uygulanan yeniden) gördüm:
struct Bar
{
Bar() : m_str("Hello world!") {}
const string* operator->() const { return &m_str; }
string m_str;
};
struct Foo
{
const Bar& operator->() const { return m_bar; }
Bar m_bar;
};
int main()
{
Foo f;
cout << f->c_str() << endl;
return 0;
}
oldukça iyi çalışıyor, gerektiren Değerlendirilmek üzere üç operator->()
- Foo::operator->()
, Bar::operator->()
ve düzenli işaretçi çözünürlüğü.
Ancak ortadaki işaretçilerle çalışmaz - Foo::operator->()
işaretçiyi Bar yerine döndürürse, derleme yapmaz. Aynı şey, örneğin auto_ptr<auto_ptr<string>>
ile olur.
Bu, aşırı yüklenmemiş operator->()
'a özgüdür, bu nedenle yalnızca bir kez uygulanır ve zincirlemeye neden olmaz? (*ptr2)-> ...
kullanmadan kodun altında çalışma yapmak mümkün mü?
int main()
{
string s = "Hello world";
auto_ptr<string> ptr1(&s);
auto_ptr<auto_ptr<string> > ptr2(&ptr1);
cout << ptr1->c_str() << endl; // fine
cout << ptr2->c_str() << endl; // breaks compilation
}
Teşekkürler!
[Aşırı yükleme işleci ->] (http://stackoverflow.com/questions/4896238/overloading-operator) [AndreyT'nin yanıtı, operatörün davranışını ve zincirlemenin nasıl oluştuğunu açıklar.] –
@James Sorunun ifadesi farklı olduğu için bunu açık tutmayı tercih ederim. Diğer insanların bu cevabı bulmasına yardımcı olabilir. –
@Judge: Kapalı bir soru otomatik olarak silinmez ve bunun gibi iyi sorulan bir soru silinmez; soru hala var olacak ve aranabilir. –