मैं हाल ही में एक मामले में भाग गया जहां मेरे पास एक कॉन्स सदस्य समारोह था जो एक ऑपरेशन कर रहा था और परिणाम लौटा रहा था। उदाहरण के लिए,क्या यह सुनिश्चित करने का कोई अच्छा तरीका है कि एक C++ फ़ंक्शन परिणाम अनदेखा नहीं किया जाता है?
class Foo { ...
Foo add(Foo const & x) const;
}
लेकिन किसी और अनजाने यह बुला रहा था यह this
वस्तु (परिणाम अनदेखी) को अद्यतन करने गया था की तरह:
Foo a = ...;
Foo b = ...;
a.add(b);
(। इस बग वास्तव में एक अपूर्ण रिफैक्टरिंग द्वारा पेश किया गया था)
क्या कोई पिछली पंक्ति किसी त्रुटि या चेतावनी को ट्रिगर करने का कोई तरीका है? अगली सबसे अच्छी बात एक रन-टाइम कैच होगी, जिसे ज्यादातर निम्न टेम्पलेट द्वारा संबोधित किया जाता है। हालांकि, यह काउंटर परिणाम द्वारा देखी गई वापसी मूल्य अनुकूलन को मारता है।
template<typename T>
class MustTake {
T & obj;
bool took;
public:
MustTake(T o) : obj(o), took(false) {}
~MustTake() { if (!took) throw "not taken"; }
operator T&() { took = true; return obj;}
};
struct Counter {
int n;
Counter() : n(0) {}
Counter(Counter const & c) : n(c.n+1) {}
~Counter() {}
};
Counter zero1() {
return Counter();
}
MustTake<Counter> zero2() {
return Counter();
}
int main() {
Counter c1 = zero1();
printf("%d\n",c1.n); // prints 0
Counter c2 = zero2();
printf("%d\n",c2.n); // prints 1
zero1(); // result ignored
zero2(); // throws
return 0;
}
मुझे लगता है मैं एक मैक्रो का उपयोग करके अक्षमता को कम कर सकते हैं लगता है तो MustTake <> केवल डिबग और जारी करने के लिए नो-सेशन है।
मैं संकलन-समय समाधान ढूंढ रहा हूं। यह असफल रहा, मैं सबसे अच्छा रन-टाइम समाधान ढूंढ रहा हूं।
आप किस कंपाइलर का उपयोग कर रहे हैं? –
यदि आप जीसीसी का उपयोग कर रहे हैं, तो मुझे लगता है कि इसके लिए चेतावनी सक्षम करने के लिए इसमें '-उन्यूज्ड-परिणाम' ध्वज है। – Xeo
एक बेहतर विधि नाम चुनना मेरा सुझाव होगा। अगर मैं 'a.add (बी)' पढ़ता हूं तो मैं तुरंत म्यूटेटर सोचता हूं। वास्तव में क्या हो रहा है इसके आधार पर 'a.newListWithHead (बी) 'या कुछ समान है? 'Add' के रूप में संक्षिप्त नहीं है, लेकिन जोड़ना वास्तव में आप यहां क्या कर रहे हैं। – msandiford