2009-07-14 20 views
244

क्या struct सी ++ में एक निर्माता है?सी ++ में संरचना कन्स्ट्रक्टर?

मैं इस समस्या को हल करने का प्रयास कर रहा हूं लेकिन मुझे वाक्यविन्यास नहीं मिल रहा है।

+1

यह एक भयानक सवाल है जिसमें कोई पृष्ठभूमि अनुसंधान या काम नहीं कर रहा था। यह इतना वोट क्यों दिया जाता है? –

उत्तर

121
struct TestStruct { 
     int id; 
     TestStruct() : id(42) 
     { 
     } 
}; 
+27

'आईडी (42) 'भाग क्या कहा जाता है? – user13107

+47

@ user13107: "[प्रारंभकर्ता सूची] (http://en.cppreference.com/w/cpp/language/initializer_list)" वह शब्द है जिसे आप ढूंढ रहे हैं। – Regexident

+4

यदि आप किसी अन्य वर्ग से प्राप्त होते हैं तो यह काम नहीं करेगा और चर क्लाइंट क्लास में विलुप्त हो जाता है। –

349

C++ में एक class और एक struct के बीच फर्क सिर्फ इतना है कि सदस्यों और आधार वर्ग, कक्षाओं में डिफ़ॉल्ट से निजी हैं, जबकि वे structs में डिफ़ॉल्ट रूप से सार्वजनिक कर रहे हैं।

तो structs में रचनाकार हो सकते हैं, और वाक्यविन्यास कक्षाओं के समान ही है।

+51

और यह संरचनाएं तब से सार्वजनिक हो जाएंगी जब से प्राप्त हो रहा है :) – GManNickG

+2

@sth संरचना और कक्षा के बीच अंतर पर आपका अधिकार, हालांकि मुझे लगता है कि उसके पास संकलन समस्या है। यह मुद्दा संरचना का उपयोग कर रहे एक संघ के कारण हो सकता है। आपके पास यूनियन में आपके प्रकार के गैर-तुच्छ कन्स्ट्रक्टर नहीं हो सकते हैं। – Chap

+2

@Chap: यदि उसके पास ठोस समस्याएं हैं जहां सामान्य समाधान काम नहीं करता है, तो शायद कुछ कोड पोस्ट करना सबसे अच्छा विचार होगा जो समस्या और उत्पन्न होने वाली संकलक त्रुटियों को दिखाता है। लेकिन सामान्य रूप से सवाल पूछे जाने पर मुझे नहीं लगता कि कोई वास्तव में कंक्रीट समस्या के बारे में बहुत अधिक अनुमान लगा सकता है, ओपी हल करने की कोशिश कर रहा है ... – sth

13

हां। एक संरचना सिर्फ एक वर्ग की तरह है, लेकिन सामान्य पर public:, वर्ग परिभाषा और जब इनहेरिट: अपने अन्य प्रश्न को ध्यान में रखते

struct Foo 
{ 
    int bar; 

    Foo(void) : 
    bar(0) 
    { 
    } 
} 

, मैं तुम्हें some tutorials के माध्यम से पढ़ने का सुझाव देते हैं। वे आपके प्रश्नों का उत्तर तेज़ी से और अधिक पूर्ण करेंगे।

10

सी ++ में हाँ संरचनाएं और कक्षाएं समान हैं, सिवाय इसके कि संरचना सदस्य डिफ़ॉल्ट रूप से सार्वजनिक होते हैं जबकि कक्षा के सदस्य डिफ़ॉल्ट रूप से निजी होते हैं। आप कक्षा में क्या कर सकते हैं जो आपको एक संरचना में करने में सक्षम होना चाहिए।

struct Foo 
{ 
    Foo() 
    { 
    // Initialize Foo 
    } 
}; 
+0

कीवर्ड 'struct' _is a class_ द्वारा बनाई गई चीज़ की तरह। –

31

हाँ, लेकिन यदि आपके पास संघ में आपकी संरचना है तो आप नहीं कर सकते हैं। यह एक वर्ग के समान है।

struct Example 
{ 
    unsigned int mTest; 
    Example() 
    { 
    } 
}; 

यूनियन structs में रचनाकारों की अनुमति नहीं देंगे। हालांकि आप संघ पर एक कन्स्ट्रक्टर बना सकते हैं। This question relates to non-trivial constructors in unions.

1

सी ++ में, हम संरचना की तरह संरचना को घोषित/परिभाषित कर सकते हैं और संरचनाओं के लिए रचनाकार/विनाशक हैं और इसमें परिभाषित चर/कार्य हैं। एकमात्र अंतर परिभाषित चर/कार्यों का डिफ़ॉल्ट दायरा है। उपरोक्त अंतर के अलावा, अधिकतर आप structs का उपयोग कर वर्ग की कार्यक्षमता की नकल करने में सक्षम होना चाहिए।

12
struct HaveSome 
{ 
    int fun; 
    HaveSome() 
    { 
     fun = 69; 
    } 
}; 

मैं कन्स्ट्रक्टर के अंदर शुरू करना चाहता हूं इसलिए मुझे आदेश रखने की आवश्यकता नहीं है।

+0

सदस्यों को हमेशा क्रम में प्रारंभ किया जाता है जिसमें वे कक्षा/संरचना निकाय में दिखाई देते हैं। कन्स्ट्रक्टर बॉडी में असाइनमेंट बनाना सिर्फ यही है ... असाइनमेंट्स। –

4

संरचना में निर्माता हाँ, यह संभव है करने के लिए यहाँ एक उदाहरण है:

#include<iostream.h> 
struct a { 
    int x; 
    a(){x=100;} 
}; 

int main() { 
    struct a a1; 
    getch(); 
} 
27

उपरोक्त सभी उत्तर तकनीकी रूप से प्रश्नकर्ता के सवाल का जवाब है, लेकिन अभी मैं एक मामले का कहना था जहां समस्याओं का सामना हो सकता है सोचा।

यदि आप घोषित इस तरह अपने struct:

typedef struct{ 
int x; 
foo(){}; 
} foo; 

आप एक निर्माता की घोषणा करने की कोशिश कर समस्याओं होगा। यह निश्चित रूप से है क्योंकि आपने वास्तव में "foo" नामक एक संरचना घोषित नहीं की है, आपने एक अज्ञात संरचना बनाई है और इसे उपनाम "foo" असाइन किया है। यह भी मतलब है कि आप एक cpp फ़ाइल में एक scoping ऑपरेटर के साथ "foo" का उपयोग करने के लिए सक्षम नहीं होंगे:

foo.h:

typedef struct{ 
int x; 
void myFunc(int y); 
} foo; 

foo।सीपीपी:

//<-- This will not work because the struct "foo" was never declared. 
void foo::myFunc(int y) 
{ 
    //do something... 
} 

इसे ठीक करने के लिए आपको या तो यह करना चाहिए:

struct foo{ 
int x; 
foo(){}; 
}; 

या इस:

typedef struct foo{ 
int x; 
foo(){}; 
} foo; 

कहाँ बाद एक struct "foo" कहा जाता है बनाता है और यह देता है उपनाम "foo" ताकि आपको संदर्भित करते समय struct कीवर्ड का उपयोग न करें।

+0

कब के बारे में: टाइपपीफ स्ट्रक्चर फू { int x; foo (int x) {}; } foo; foo :: foo (int x) {...}; यह काम नहीं करता है ... – bordeo

20

जैसा कि अन्य उत्तरों का उल्लेख है, एक संरचना मूल रूप से सी ++ में कक्षा के रूप में माना जाता है। यह आपको एक कन्स्ट्रक्टर रखने की अनुमति देता है जिसका उपयोग डिफ़ॉल्ट मानों के साथ संरचना को आरंभ करने के लिए किया जा सकता है। नीचे, कन्स्ट्रक्टर sz और b तर्क के रूप में लेता है, और अन्य चर को कुछ डिफ़ॉल्ट मानों में प्रारंभ करता है।

struct blocknode 
{ 
    unsigned int bsize; 
    bool free; 
    unsigned char *bptr; 
    blocknode *next; 
    blocknode *prev; 

    blocknode(unsigned int sz, unsigned char *b, bool f = true, 
       blocknode *p = 0, blocknode *n = 0) : 
       bsize(sz), free(f), bptr(b), prev(p), next(n) {} 
}; 

उपयोग:

unsigned char *bptr = new unsigned char[1024]; 
blocknode *fblock = new blocknode(1024, btpr); 
+1

न केवल "मूल रूप से माना जाता है" ... कीवर्ड 'स्ट्रक्चर' शब्दशः एक वर्ग बनाता है। अवधि। –

4

C++ में दोनों struct & class छोड़कर struct's डिफ़ॉल्ट सदस्य पहुँच विनिर्देशक बराबर हैं public & वर्ग private है।

सी ++ में struct होने का कारण सी ++ सी का सुपरसेट है और legacy C types के साथ पिछड़ा संगत होना चाहिए।

उदाहरण के लिए यदि भाषा उपयोगकर्ता अपने सी ++ कोड & में कुछ सी हेडर फ़ाइल legacy-c.h शामिल करने का प्रयास करता है तो इसमें struct Test {int x,y}; शामिल है। struct Test के सदस्य सी

9

नोट एक दिलचस्प अंतर (कम से कम एमएस सी ++ संकलक के साथ) है कि वहाँ की तरह के रूप में सुलभ होना चाहिए:


आप इस

की तरह एक सादे वेनिला struct है
struct MyStruct { 
    int id; 
    double x; 
    double y; 
} MYSTRUCT; 

तो कहीं और आप इस तरह इस तरह की वस्तुओं की एक सरणी को प्रारंभ हो सकता है:

MYSTRUCT _pointList[] = { 
    { 1, 1.0, 1.0 }, 
    { 2, 1.0, 2.0 }, 
    { 3, 2.0, 1.0 } 
}; 

हालांकि, जैसे ही आप इस तरह के MyStruct करने के लिए एक उपयोगकर्ता परिभाषित निर्माता जोड़ने के रूप में लोगों के ऊपर चर्चा के रूप में आप इस तरह एक त्रुटि प्राप्त होगी:

'MyStruct' : Types with user defined constructors are not aggregate 
    <file and line> : error C2552: '_pointList' : non-aggregates cannot 
    be initialized with initializer list. 

ताकि कम से कम एक अन्य अंतर है एक संरचना और एक वर्ग के बीच। इस प्रकार का प्रारंभिक ओओ अभ्यास अच्छा नहीं हो सकता है, लेकिन यह विरासत WinSDK C++ कोड में सभी जगहों पर दिखाई देता है जो मैं समर्थन करता हूं। जैसा कि आप जानते ...

+0

यह संकलक से गलत व्यवहार की तरह लगता है (मान लीजिए कि 'वर्ग' संस्करण अपने सदस्यों को 'सार्वजनिक' घोषित करता है)। एमएस कहता है ["विजुअल सी ++ डेटा प्रकारों को उन कुल मिलाकर नहीं देता है जिनमें रचनाकार शामिल हैं"] (https://msdn.microsoft.com/en-us/library/0s6730bb.aspx), लेकिन यह इंगित नहीं करता कि वह क्यों ' कक्षाओं पर भी लागू नहीं है। और ऐसा लगता है कि वीएस 2015 में काम करता है। – mgiuffrida

+0

वीएस 2017 पूर्वावलोकन 4 में नवीनतम बिट्स के साथ भी ठीक काम करता है। एपीआई संस्करण 141 –

+0

तो अलुआन, क्या आप कह रहे हैं कि वीएस2017 अब रचनाकारों के साथ structs के लिए प्रारंभकर्ता सूची की अनुमति देता है? मैंने अभी तक पूर्वावलोकन की कोशिश नहीं की है ... धन्यवाद! –

8

में C++ struct और C++ वर्ग केवल एक डिफ़ॉल्ट struct सदस्यों द्वारा अंतर सार्वजनिक होते हैं और वर्ग के सदस्यों के निजी हैं।

/*Here, C++ program constructor in struct*/ 
#include <iostream> 
using namespace std; 

struct hello 
    { 
    public:  //by default also it is public 
     hello();  
     ~hello(); 
    }; 

hello::hello() 
    { 
    cout<<"calling constructor...!"<<endl; 
    } 

hello::~hello() 
    { 
    cout<<"calling destructor...!"<<endl; 
    } 

int main() 
{ 
hello obj;  //creating a hello obj, calling hello constructor and destructor 

return 0; 
} 
1

सिंटेक्स सी ++ में कक्षा के समान है।यदि आप सी ++ में कन्स्ट्रक्टर बनाने के बारे में जानते हैं तो यह संरचना में समान है।

struct Date 
{ 
int day; 

Date(int d) 
{ 
    day = d; 
} 
void printDay() 
{ 
    cout << "day " << day << endl; 
} 

}; 

संरचना सी ++ में कक्षा के रूप में सभी चीजें हो सकती है। जैसा कि पहले कहा गया था कि अंतर केवल डिफ़ॉल्ट रूप से सी ++ सदस्य के पास निजी पहुंच है लेकिन संरचना में यह सार्वजनिक है। लेकिन प्रोग्रामिंग विचार के अनुसार डेटा-केवल संरचनाओं के लिए संरचना कीवर्ड का उपयोग करें। उन ऑब्जेक्ट्स के लिए क्लास कीवर्ड का उपयोग करें जिनमें डेटा और फ़ंक्शन दोनों हों।

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