2016-09-25 13 views
8

के कन्स्ट्रक्टर से कार्य करता है सबसे पहले, मैं सी ++ 11 कन्स्ट्रक्टर चेनिंग उर्फ ​​कन्स्ट्रक्टर प्रतिनिधिमंडल के बारे में बात नहीं कर रहा हूं।चेन-कॉलिंग सदस्य नामित ऑब्जेक्ट

कक्षा सदस्य कार्य स्वयं (संदर्भ) के संदर्भ को वापस कर सकते हैं ताकि फ़ंक्शन कॉल को जंजीर बनाया जा सके। (जैसे कि cout < < ऑपरेटर चेन कॉल की अनुमति देने के लिए काम करता है।)

जब किसी अनाम ऑब्जेक्ट को तुरंत चालू किया जाता है, तो ऐसी श्रृंखला कॉल कन्स्ट्रक्टर से हो सकती है।

क्या चेन कॉल किसी नामित ऑब्जेक्ट के निर्माता बन सकते हैं? नीचे "foo a" और "foo b" के लिए रेखाएं संकलित नहीं होती हैं, इसलिए मैं सोच रहा हूं कि कोई अलग वाक्यविन्यास है या नहीं।

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

हैरानी की बात है, मेरे संकलक अनुकूलित है कि एक निरंतर करने के लिए है, इसलिए वहां नहीं निष्पादन दंड है:

#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

मूल रूप से "नहीं"। 'foo (1)' एक अभिव्यक्ति है, 'foo a (3)' अभिव्यक्ति नहीं है। आपको 'foo a (3) लिखना होगा; a.inc(); ' –

उत्तर

2

आप एक समान प्रभाव है कि चेन प्रारंभ कर सकते हैं।

2

मुझे लगता है कि यह Almost Always Auto शैली के फायदों में से एक है। आप लेखन की आदत में हैं, तो:

auto a = foo{3}; 

तो आप कर सकते हैं विसंगति के बिना श्रृंखला कॉल:

auto a = foo{3}.inc(); 
संबंधित मुद्दे