2016-09-25 11 views
8

İlk olarak, C++ 11 yapıcı zincirleme aka constructor delegation hakkında konuşmuyorum.Zincir çağrısı üyesi, adlandırılmış bir nesnenin yapıcısını kapatır

Sınıf üyesi işlevleri kendisine bir başvuru döndürebilir (sınıf) böylece işlev çağrıları zincirlenebilir. (Örneğin, < < operatörünün zincir çağrılarına izin vermek için nasıl çalıştığı gibi.)

Anonim bir nesneyi başlatırken, bu tür zincir çağrıları yapıcıdan çıkabilir.

Zincir aramaları, adlandırılmış bir nesnenin yapıcısından yapılabilir mi? Aşağıdaki "foo a" ve "foo b" satırları derlenmez, bu yüzden farklı bir sözdizimi olup olmadığını merak ediyorum.

foo c = foo{5}.inc().inc(); 

Hayret, benim derleyici bir sabite, yani bir performans cezası olmadığını optimize:

#include <iostream> 
using namespace std; 

class foo { 
    public: 
     foo(int x) : val{x} { }; 
     foo& inc() { ++val; return *this; } 
     int getVal() { return val; }; 
    private: 
     int val; 
}; 

int main() { 
    cout << foo(1).inc().getVal() << endl; // prints 2 
    cout << foo{2}.inc().inc().inc().inc().getVal() << endl; // prints 6 
    foo a(3).inc(); // error: expected ‘,’ or ‘;’ before ‘.’ token 
    foo b{4}.inc(); // error: expected ‘,’ or ‘;’ before ‘.’ token 
    cout << a.getVal() << endl; 
    cout << b.getVal() << endl; 
} 
+3

"hayır". foo (1) 'ifadesidir,' foo a (3) 'ifadesi değildir. Foo a (3) yazmanız gerekecek; a.inc(); ' –

cevap

2

Sen zincirler başlatma benzer bir etkiyi elde edebilirsiniz.

2

Bu, Almost Always Auto stilinin avantajlarından biri olduğunu düşünüyorum. yazılı alışkanlığı varsa:

auto a = foo{3}; 

sonra yapabilirsiniz tutarsızlık olmadan zincir aramalar:

temelde
auto a = foo{3}.inc();