2010-10-12 9 views
12

मैं इस सी है ++ कोड:रूपांतरण का अनुरोध किया

#include <iostream> 
using namespace std; 
struct MyItem 
{ 
    int value; 
    MyItem* nextItem; 
}; 

int main() { 
    MyItem item = new MyItem; 
    return 0; 
} 

और मैं त्रुटि मिलती है:

error: conversion from `MyItem*' to non-scalar type `MyItem' requested 

जी के साथ ++ संकलन। इसका क्या मतलब है? और यहाँ क्या चल रहा है?

उत्तर

19

प्रयास करें:

MyItem * item = new MyItem; 

लेकिन उपयोग के बाद इसे हटाने के लिए मत भूलना:

delete item; 
+0

मैंने * आइटम की कोशिश की। मामलों के बीच अंतरिक्ष सोचो?लिनक्स सर्वर बस क्रैश हो गया है, इसके बाद मुझे बैक अप लेने के लिए इंतजार करना होगा इससे पहले कि मैं इसे * और आइटम के बीच की जगह के साथ आज़मा सकूं। – kralco626

+0

@ क्राल्को: नहीं, इससे कोई फर्क नहीं पड़ता। क्या आपके पास एक प्रारंभिक सी ++ पुस्तक है? – GManNickG

+0

नहीं। मैं एक ऑपरेटिंग सिस्टम कक्षा ले रहा हूं। मैंने जावा में प्रोग्रामिंग कक्षाओं का एक टन लिया और सी # का उपयोग किया और अभी भी बड़े पैमाने पर काम पर। हालांकि उन भाषाओं में से कोई भी सी/सी ++ जैसे पॉइंटर्स का उपयोग नहीं करता है। यह एक ऐसे कार्यक्रम को लागू करने के साथ एक बड़ी परियोजना का हिस्सा है जो पाइपलाइनिंग करता है, (भले ही लिनक्स ने इसे बनाया है)। मेरे पास पूरी चीज लिखी गई है और मुझे यह त्रुटि मिलती है। – kralco626

18

आप

MyItem item; 

जो स्टैक पर MyItem का एक उदाहरण आवंटित मिलाया गया है । उदाहरण के लिए स्मृति स्वचालित रूप से संलग्न गुंजाइश

और

MyItem * item = new MyItem; 

जो ढेर पर MyItem का एक उदाहरण आवंटित के अंत में मुक्त हो जाता है। आप इस उदाहरण को पॉइंटर का उपयोग करके देखेंगे और delete item का उपयोग करते समय स्मृति को स्पष्ट रूप से मुक्त करना होगा। करने की जरूरत नहीं

3

यहाँ BTW सही

struct MyItem     // corrected spelling struct 
{ 
    var value;     // added ; 
    struct MyItem * nextItem; // add "struct" and added ; 
};        // added ; 

MyItem * item = new MyItem; // added * before item 

delete item;     // not exactly here, but some where in your code 

पर उल्लेख किया परिवर्तन के साथ कोड संपादित किया जाता है, आप new है। आप संभव के रूप में

MyItem anotherItem; 
+0

या, लेकिन आवश्यकता यह है कि हम नए का उपयोग करते हैं :(। जैसे ही लिनक्स सर्वर जो लगभग 30 मिनट पहले दुर्घटनाग्रस्त हो जाते हैं, मैं इसे आज़माउंगा। – kralco626

4

सबसे पहले ढेर पर एक MyItem वस्तु बना सकते हैं, इस कोड संकलन नहीं होगा क्योंकि आप प्रत्येक सदस्य चर घोषणा के बाद और MyItem घोषणा और कीवर्ड "struct" के बाद अर्द्ध कोलन भूल गया गलत टाइप किया गया है। आपका कोड इस तरह दिखना चाहिए:

struct MyItem 
{ 
var value; 
MyItem* nextItem; 
}; 

MyItem item = new MyItem; 

अब आप अपने सवाल का जवाब देने, इस कोड क्योंकि नए ऑपरेटर वस्तु बनाया (प्रकार MyItem* के एक मूल्य) के लिए सूचक रिटर्न काम नहीं करता है और आप इस सूचक आवंटित करने के लिए कोशिश कर रहे हैं MyItem प्रकार के चर के लिए। कंपाइलर आपको ऐसा करने की अनुमति नहीं देता है (क्योंकि मान और चर के विभिन्न प्रकार होते हैं)। आप इस तरह की एक apropriate चर में सूचक संग्रहीत करना चाहिए,:

MyItem* item = new MyItem; 

इस मामले में, आप delete item के लिए याद स्मृति रिसाव से बचने के लिए एक बार आप कोई और अधिक इसकी जरूरत चाहिए।

वैकल्पिक रूप से, आप new ऑपरेटर के बिना स्टैक में ऑब्जेक्ट बना सकते हैं।

MyItem item; 

इस मामले में, कार्य वापस आने पर ऑब्जेक्ट अस्तित्व में रहता है; आपको इसे हटाने के लिए याद रखने की आवश्यकता नहीं है।

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