2010-05-21 18 views
19

सी ++ में यदि मैं पॉइंटर्स की एक सरणी चाहता हूं ताकि मैं उन्हें बाद के चरण में अलग-अलग ऑब्जेक्ट्स पर इंगित कर सकूं, सिंटैक्स कैसा दिखता है।सी ++ पॉइंटर्स का एरे

संपादित

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

कृपया कोई स्टेल नहीं है और नहीं, मैं यह नहीं जानना चाहता कि यह कैसा लगता है कि यह पागल है आदि यह आपकी राय है।

+1

यह आपके प्रश्न का सख्ती से जवाब नहीं देता है, लेकिन ज्यादातर मामलों में पॉइंटर्स की एक सरणी का उपयोग करना बेहतर होगा। जैसे std :: vector संग्रह; –

+0

"फू ऑब्जेक्ट्स का कोई वास्तविक प्रारंभ नहीं" का क्या अर्थ है? साथ ही, क्या आप जानते हैं कि सरणी में कितने तत्व संकलित समय पर हैं? – Naveen

+0

आपने अभी तक किस कोड का उत्पादन किया है? – Default

उत्तर

6

उदाहरण के लिए, यदि आप int पॉइंटर्स की एक सरणी चाहते हैं तो यह int* a[10] होगा। इसका मतलब है कि परिवर्तनीय एस का संग्रह है।

संपादित

मैं इस लगता है कि आप क्या करना चाहते है:

class Bar 
{ 
}; 

class Foo 
{ 
public: 

    //Takes number of bar elements in the pointer array 
    Foo(int size_in); 

    ~Foo(); 
    void add(Bar& bar); 
private: 

    //Pointer to bar array 
    Bar** m_pBarArr; 

    //Current fee bar index 
    int m_index; 
}; 

Foo::Foo(int size_in) : m_index(0) 
{ 
    //Allocate memory for the array of bar pointers 
    m_pBarArr = new Bar*[size_in]; 
} 

Foo::~Foo() 
{ 
    //Notice delete[] and not delete 
    delete[] m_pBarArr; 
    m_pBarArr = NULL; 
} 

void Foo::add(Bar &bar) 
{ 
    //Store the pointer into the array. 
    //This is dangerous, you are assuming that bar object 
    //is valid even when you try to use it 
    m_pBarArr[m_index++] = &bar; 
} 
+0

एक कॉपी ऑपरेटर को लागू करने (या निजी के रूप में घोषित) को भूलना न भूलें, [नियम का तीन] देखें (http://stackoverflow.com/q/4172722)। – basic6

46

क्या आप चाहते हैं:

Foo (*array)[10]; // pointer to array of 10 Foos 
:

Foo *array[10]; // array of 10 Foo pointers 
नहीं

साथ भ्रमित होने की

किसी भी मामले में, कुछ भी स्वचालित रूप से प्रारंभ नहीं किया जाएगा क्योंकि ये फ़ूज़ को पॉइंटर्स का प्रतिनिधित्व करते हैं जिन्हें अभी तक कुछ असाइन नहीं किया गया है (उदा। नए के साथ)।

अंततः मुझे सी में पॉइंटर/सरणी घोषणा वाक्यविन्यास मिला "जब मुझे एहसास हुआ कि यह वर्णन करता है कि आप बेस प्रकार का उपयोग कैसे करते हैं। Foo *array[5][10]; का अर्थ है कि *array[0..4][0..9] (5 आइटमों की सरणी पर सबस्क्रिप्ट, फिर 10 आइटमों की सरणी पर सबस्क्रिप्ट, फिर पॉइंटर के रूप में ड्रेफरेंस) एक फू ऑब्जेक्ट तक पहुंच जाएगा (ध्यान दें कि []* से अधिक प्राथमिकता है)।

यह पीछे की ओर लगता है। आपको लगता है कि int array[5][10]; (ए.के.ए. int (array[5])[10];) 10 int array[5] की एक सरणी है। मान लीजिए कि यह मामला था। फिर आप array[9][4] कहकर सरणी के अंतिम तत्व तक पहुंच पाएंगे। क्या वह पीछे भी नहीं दिखता है? चूंकि एक सी सरणी घोषणा एक पैटर्न है जो आधार प्रकार को प्राप्त करने के लिए इंगित करता है (सरणी अभिव्यक्तियों की संरचना की तुलना में किसी की अपेक्षा की जा सकती है), सरणी घोषणाएं और सरणी का उपयोग करके कोड को फ्लिपफ्लॉप नहीं किया जाना चाहिए।

+0

+1 हां, सी घोषणाएं वास्तव में समझ में आती हैं :) – fredoverflow

+7

इस प्रश्न के लिए भविष्य के आगंतुकों के लिए: आप [इस तरह के टूल] का उपयोग कर सकते हैं (http://cdecl.org/) जो इन घोषणाओं को किसी चीज़ में अनुवादित करता है यह एक वैरिएबल घोषित करने की बेहतर समझ प्राप्त करने के लिए अंग्रेजी जैसा दिखता है। – Sumurai8

3

मैं इसे इन पंक्तियों के साथ कुछ करना होगा:

class Foo{ 
... 
}; 

int main(){ 
    Foo* arrayOfFoo[100]; //[1] 

    arrayOfFoo[0] = new Foo; //[2] 
} 

[1] इस फू-वस्तुओं के लिए 100 संकेत की एक सरणी में आता है। लेकिन वास्तव में कोई फू-ऑब्जेक्ट्स नहीं बनाए जाते हैं।

[2] यह ऑब्जेक्ट को चालू करने का एक संभावित तरीका है, और साथ ही साथ इस ऑब्जेक्ट को अपनी सरणी की पहली स्थिति में एक पॉइंटर सहेजें।

3

आप एसटीएल का उपयोग नहीं करते हैं, तो कोड लग रहा है एक बहुत बिट सी

तरह
#include <cstdlib> 
#include <new> 

template< class T > 
void append_to_array(T *&arr, size_t &n, T const &obj) { 
    T *tmp = static_cast<T*>(std::realloc(arr, sizeof(T) * (n+1))); 
    if (tmp == NULL) throw std::bad_alloc(__FUNCTION__); 
     // assign things now that there is no exception 
    arr = tmp; 
    new(&arr[ n ]) T(obj); // placement new 
    ++ n; 
} 

T किसी भी पॉड प्रकार हो सकता है , पॉइंटर्स सहित।

ध्यान दें कि arrmalloc द्वारा आवंटित किया जाना चाहिए, new[] नहीं।

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