उदाहरण के लिए:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct TreeNode {
vector<TreeNode> children;
string name;
};
int main() {
TreeNode leafNode;
leafNode.name="c";
TreeNode middleNode;
middleNode.name="b";
middleNode.children.push_back(leafNode);
TreeNode rootNode;
rootNode.name="a";
rootNode.children.push_back(middleNode);
rootNode=rootNode.children[0];
cout <<rootNode.name <<endl;
}
आउटपुट c
, CLANG और GCC दोनों में। बेशक, मुझे उम्मीद है कि यह b
आउटपुट करेगा। यहाँ क्या चल रहा है?
2 जवाब
जैसा कि अन्य ने टिप्पणियों में बताया है, आपको वास्तव में डीबगर सेट अप करने का प्रयास करना चाहिए और पहले अपना कोड डीबग करना चाहिए। इस तरह आप प्रोग्रामिंग में बहुत कुछ सीखते हैं।
हालांकि, यदि आप डिबगिंग के अभ्यस्त नहीं हैं, तो संभवतः आपके लिए समस्या का पता लगाना कठिन होगा, क्योंकि विचाराधीन कोड कंपाइलर जेनरेट किया गया है।
आप सही कह रहे हैं कि कॉपी कंस्ट्रक्टर कमोबेश आपके डेटा को भ्रष्ट करता है। लेकिन यह कंपाइलर्स की गलती नहीं है। डिफ़ॉल्ट कॉपी कंस्ट्रक्टर संदर्भ द्वारा अपना तर्क लेता है और आप rootNode
के सदस्य का संदर्भ rootNode
के कॉपी कंस्ट्रक्टर को पास कर रहे हैं। तो असल में आप वस्तु को स्वयं के एक हिस्से से अधिलेखित कर रहे हैं।
असाइनमेंट या कॉपी के दौरान कमोबेश क्या होता है:
TreeNode(const TreeNode& other) {
children = other.children;
name = other.name;
}
इसलिए यदि आप इस ऑपरेशन को rootNode.children[0]
पास करते हैं, तो इसे प्रभावी रूप से कम कर दिया जाएगा:
rootNode.children = rootNode.children[0].children; // copies the children of 'b' to 'a'
rootNode.name = rootNode.children[0].name; // children[0] now refers to the first
// of 'b's children, so name will be 'c' !!
एक संभावित समाधान यह है कि पहले इसका उपयोग करके एक सच्ची प्रतिलिपि बनाई जाए:
rootNode = TreeNode{ rootNode.children[0] };
संकलक के आधार पर व्यवहार भिन्न हो सकता है। वीएस2019 में आपके उदाहरण की कोशिश करते समय मुझे एक खाली आउटपुट मिलता है।
आपको सेल्फ असाइनमेंट या सेल्फ कॉपी कंस्ट्रक्शन का इस्तेमाल नहीं करना चाहिए। आंशिक असाइनमेंट है rootNode=rootNode.children[0];
इस समस्या से बचने के लिए पॉइंटर्स का इस्तेमाल करना चाहिए
#include <iostream>
#include <vector>
#include <string>
#include <memory> // for std::shared_ptr
using namespace std;
struct TreeNode; // forward declaration
using TreeNodePtr = std::shared_ptr<TreeNode>;
struct TreeNode {
vector<TreeNodePtr> children;
string name;
};
int main() {
auto leafNode = std::make_shared<TreeNode>();
leafNode->name="c";
auto middleNode = std::make_shared<TreeNode>();
middleNode->name="b";
middleNode->children.push_back(leafNode);
auto rootNode = std::make_shared<TreeNode>();
rootNode->name="a";
rootNode->children.push_back(middleNode);
rootNode=rootNode->children[0];
cout <<rootNode->name <<endl;
}
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।