2010-02-06 6 views
9

मान लीजिए कि मैं एक अस्थायी वस्तु को किसी फ़ंक्शन में पास करना चाहता हूं। क्या स्ट्रक्चर के साथ कोड बनाम 2 की 1 पंक्ति में ऐसा करने का कोई तरीका है?सी ++ में मूल्य द्वारा अस्थायी संरचना को पारित करने का सरल तरीका?


एक वर्ग के साथ

, मैं कर सकते हैं:

class_func(TestClass(5, 7)); 

दिया:

class TestClass 
{ 
private: 
    int a; 
    short b; 

public: 
    TestClass(int a_a, short a_b) : a(a_a), b(a_b) 
    { 
    } 

    int A() const 
    { 
     return a; 
    } 

    short B() const 
    { 
     return b; 
    } 
}; 

void class_func(const TestClass & a_class) 
{ 
    printf("%d %d\n", a_class.A(), a_class.B()); 
} 

अब, मैं कैसे एक struct के साथ क्या करते हैं? निकटतम मुझे मिल गया है है:

test_struct new_struct = { 5, 7 }; 
struct_func(new_struct); 

दिया:

struct test_struct 
{ 
    int a; 
    short b; 
}; 

void struct_func(const test_struct & a_struct) 
{ 
    printf("%d %d\n", a_struct.a, a_struct.b); 
} 

वस्तु अधिक सरल है, लेकिन मुझे आश्चर्य है कि वहाँ सही समारोह कॉल के साथ लाइन में struct सदस्य प्रारंभ करने के लिए एक तरीका है संरचना को एक कन्स्ट्रक्टर देने के बिना। (मैं एक कन्स्ट्रक्टर नहीं चाहता हूं। पूरे कारण में मैं संरचना का उपयोग कर रहा हूं बॉयलरप्लेट को इस अलग मामले में कक्षा सम्मेलनों को प्राप्त/सेट करने से बचाना है।)

+3

तुम अब भी एक निर्माता Kee लिख सकते हैं सदस्य चर सार्वजनिक पिंग। इसलिए आपको प्राप्त/सेट विधियों की आवश्यकता नहीं है। क्या ऐसा करने में कोई समस्या है? – Naveen

+0

क्या आप सी में स्ट्रक्चर प्रारंभिकरण प्राप्त करने का मतलब रखते थे? सी ++ में एक स्ट्रक्चर भी कर सकता है जो आप कक्षा में कर रहे हैं। – sand

उत्तर

0

मैं सी ++ विशेषज्ञ नहीं हूं, लेकिन आप नहीं कर सकते बस अपने फ़ंक्शन कॉल की तर्क सूची के अंदर निर्माण कथन रखें?

+0

नहीं, कुछ कंपाइलर उस तरह की चीज की अनुमति देते हैं और यह C++ 0x (§5.2.3/3) में है लेकिन यह वर्तमान में मानक नहीं है। – Potatoswatter

2

आप कक्षा के साथ ऐसा ही कर सकते हैं जैसा आप करते हैं। बस अपनी संरचना को एक कन्स्ट्रक्टर दें और आप इसे स्ट्रक्चर की तरह इनलाइन बना सकते हैं। एक कन्स्ट्रक्टर का उपयोग करने के बारे में आपके आपत्तियां निराधार हैं। कक्षा और संरचना के बीच प्राथमिक अंतर इसके साथ जुड़ी डिफ़ॉल्ट दृश्यता है। कक्षाओं के लिए, यह निजी है; structs के लिए, सार्वजनिक। कोई "बॉयलरप्लेट" नहीं है, और आपको किसी भी "सम्मेलन" का पालन नहीं करना है जिसे आप नहीं चाहते हैं।

struct test_struct 
{ 
    int a; 
    short b; 

    test_struct(int a_, int b_): a(a_), b(b_) { } 
}; 

struct_func(test_struct(5, 7)); 
+0

@ टेरी महाफफी, आप निश्चित रूप से कक्षा के साथ ब्रेस-प्रारंभिकरण का उपयोग कर सकते हैं। बाधाएं संरचना के समान हैं।'Struct' और' class' कीवर्ड * के बीच का अंतर केवल डिफ़ॉल्ट दृश्यता है (सदस्यों और बेस क्लास के लिए)। आप कीवर्ड को भी मिश्रण कर सकते हैं: 'struct t {}; कक्षा टी वी; '। – avakar

+0

हाँ, आप सही हैं। मैंने सोचा कि कुछ कारणों से केवल structs पीओडी हो सकते हैं। मैंने अपनी टिप्पणी –

0

स्ट्रक्चर में रचनाकार भी हो सकते हैं, ताकि आप कक्षा के उदाहरण के साथ उनके साथ भी वही कर सकें।

4

यह C++11 standard में संभव है। असल में, आप यह करने में सक्षम हैं:

struct_func(test_struct{5, 7}); 

यह पहले से ही संस्करण 4.4 के रूप में जीसीसी में उपलब्ध है।

+0

वापस ले ली है, वास्तव में, आपको स्पष्ट रूप से इस प्रकार की घोषणा करने की आवश्यकता नहीं है, जब तक कि ब्रांडेड इनिट सूची द्वारा बनाए जा सकने वाले प्रकारों के बारे में अस्पष्टता न हो: '# शामिल करें संरचना एस { int i; डबल डी; }; शून्य एफ (एस एस) { std :: cout << s.i << '' << s.d << std :: endl; } int मुख्य (int, char **) { f ({7, 42}); } 'मुझे नहीं लगता कि मैं कभी भी एक समान प्रारंभिकता या सी ++ 11 में किए गए सभी अन्य बड़े पैमाने पर अपग्रेड किए बिना प्राप्त कर सकता हूं जिसे मैं पूरी तरह से मंजूरी देता हूं। –

8

अपने struct में एक निर्माता उपलब्ध कराने के लिए एक वैकल्पिक, एक make_xxx मुक्त समारोह प्रदान करने के लिए किया जाएगा:

struct Point {int x; int y;}; 

Point makePoint(int x, int y) {Point p = {x, y}; return p;} 

plot(makePoint(12, 34)); 

एक कारण आप structs में कंस्ट्रक्टर्स से बचने के लिए चाहते हो सकता है की सरणियों में ब्रेस-प्रारंभ अनुमति देने के लिए है structs:

// Not allowed when constructor is defined 
const Point points[] = {{12,34}, {23,45}, {34,56}}; 

बनाम

const Point points[] = {Point(12,34), Point(23,45), Point(34,56)}; 
+1

ध्यान दें कि सी ++ 11 में, उपयोग 'प्वाइंट' कन्स्ट्रक्टर परिभाषित किए जाने पर भी ब्रेस-प्रारंभिकरण का उपयोग कर सकते हैं। उस स्थिति में, ब्रेसिज़ के भीतर तर्क कन्स्ट्रक्टर को पास कर दिया जाएगा। इस सुविधा को [वर्दी प्रारंभिक] कहा जाता है (https://en.wikipedia.org/wiki/C%2B%2B11#Uniform_initialization)। –

संबंधित मुद्दे