मैंने अभी तक साझा पॉइंटर्स पर काम नहीं किया है .. मुझे बस अवधारणा पता है। मैं निम्नलिखित सी ++ वर्ग में फ़ंक्शंस डीबग करने का प्रयास कर रहा हूं, जो एक एक्सएमएल फ़ाइल का डेटा संग्रहीत करता है (xerces लाइब्रेरी के माध्यम से रीड-इन)।जीडीबी में, मैं कुछ वर्ग कार्यों को कॉल कर सकता हूं, लेकिन अन्य "हल नहीं किए जा सकते"। क्यूं कर?
// header file
class ParamNode;
typedef boost::shared_ptr<ParamNode> PtrParamNode;
class ParamNode : public boost::enable_shared_from_this<ParamNode> {
public:
...
typedef enum { DEFAULT, EX, PASS, INSERT, APPEND } ActionType;
bool hasChildren() const;
PtrParamNode GetChildren();
PtrParamNode Get(const std::string& name, ActionType = DEFAULT);
protected:
....
ActionType defaultAction_;
}
अब अगर मैं जिसमें मैं वर्ग ParamNode
सूचक का एक उदाहरण है कोड का एक टुकड़ा डिबगिंग कर रहा हूँ, और यह paramNode_
PtrParamNode paramNode_;
// read xml file with xerces
paramNode_ = xerces->CreateParamNodeInstance();
// now, the xml data is stored in paramNode_.
std::string probGeo;
// this works in the code, but not in (gdb)!!
paramNode_->Get("domain")->GetValue("gt",probGeo);
cout << probGeo << endl; // <-- breakpoint HERE
कहा जाता है gdb
का उपयोग करते हुए मैं paramNode_
निरीक्षण कर रहा हूँ वस्तु:
(gdb) p paramNode_
$29 = {px = 0x295df70, pn = {pi_ = 0x2957ac0}}
(gdb) p *paramNode_.px
$30 = {
<boost::enable_shared_from_this<mainclass::ParamNode>> = {weak_this_ = {px = 0x295df70, pn = {pi_ = 0x2957ac0}}},
_vptr.ParamNode = 0x20d5ad0 <vtable for mainclass::ParamNode+16>,
...
name_= {...},
children_ = {size_ = 6, capacity_ = 8, data_ = 0x2969798},
defaultAction_ = mainclass::ParamNode::EX, }
और प्रिंट अपने सदस्यों:
012,(gdb) ptype *paramNode_.px
type = class mainclass::ParamNode : public boost::enable_shared_from_this<mainclass::ParamNode> {
protected:
...
mainclass::ParamNode::ActionType defaultAction_;
public:
bool HasChildren(void) const;
mainclass::PtrParamNode GetChildren(void);
mainclass::PtrParamNode Get(const std::string &, mainclass::ParamNode::ActionType);
हालांकि, मैं केवल कार्यों HasChildren
या GetChildren
कॉल कर सकते हैं, एक त्रुटि में Get
gdb
से परिणाम बुला जबकि: कोड में
(gdb) p (paramNode_.px)->HasChildren()
$7 = true
(gdb) p (paramNode_.px)->GetChildren()
$8 = (mainclass::ParamNodeList &) @0x295dfb8: {
size_ = 6,
capacity_ = 8,
data_ = 0x29697a8
}
(gdb) p (paramNode_.px)->Get("domain")
Cannot resolve method mainclass::ParamNode::Get to any overloaded instance
(gdb) set overload-resolution off
(gdb) p (paramNode_.px)->Get("domain")
One of the arguments you tried to pass to Get could not be converted to what the function wants.
(gdb) p (paramNode_.px)->Get("domain", (paramNode_.px).defaultAction_)
One of the arguments you tried to pass to Get could not be converted to what the function wants.
, Get("domain")
फ़ंक्शन को निष्पादित बस ठीक काम करता है। ऐसा क्यों है? साझा प्वाइंटर्स के सीमित ज्ञान के कारण, यदि आप अपने उत्तर में स्पष्टीकरण शामिल करते हैं तो मैं आभारी हूं।
शायद इसका 'साझा_ptr' से कोई लेना देना नहीं है। हो सकता है कि 'gdb'' 'डोमेन' '('const char [7]' को कन्वर्ट नहीं कर सकता है,' const std :: string & '('अस्थायी' std :: स्ट्रिंग का निर्माण करके ') रनटाइम पर। मेरे पास हाथ में 'gdb' नहीं है, लेकिन मेरा सुझाव है कि आप' std :: size_t f (const std :: string & s) {return s.length() जैसे बहुत ही सरल कोड के साथ प्रयास करें; } ', फिर gdb 'p f (" हैलो ")' और शायद 'p f (std :: string (" हैलो "))', यह देखने के लिए कि क्या आपको अभी भी त्रुटि मिलती है। –
अच्छा विचार। मैंने बस कोशिश की। समारोह 'f' कोड में काम करता है, तथापि,' (gdb) पीएफ ("हैलो") '(gdb) memory.' में नहीं स्थित पर अधिभार संकल्प सेट मूल्य का पता लेने के लिए प्रयास (gdb) पीएफ (" hsdflo ") किसी भी अधिभारित उदाहरण के लिए फ़ंक्शन f को हल नहीं कर सकता है। जीडीबी में 'std: string' का उपयोग करके एक वाक्यविन्यास त्रुटि हुई ... – Sebastian