न्यूबी से सी ++ यहां। मैं A Deeper Look at Signals and Slots पढ़ रहा था, जो दावा करता है कि 1) कॉलबैक स्वाभाविक रूप से टाइप-असुरक्षित हैं, और 2) उन्हें सुरक्षित बनाने के लिए आपको अपने फ़ंक्शन के चारों ओर शुद्ध वर्चुअल क्लास रैपर को परिभाषित करने की आवश्यकता है। मुझे समझ में मुश्किल हो रही है कि यह सच क्यों है। उदाहरण के लिए, यहाँ कोड क्यूटी पर प्रदान करता है उनके tutorial page for signals and slots:सादे पुराने कॉलबैक से सिग्नल और स्लॉट बेहतर क्यों हैं?
#include <functional>
#include <vector>
class Counter
{
public:
Counter() { m_value = 0; }
int value() const { return m_value; }
std::vector<std::function<void(int)>> valueChanged;
void setValue(int value);
private:
int m_value;
};
void Counter::setValue(int value)
{
if (value != m_value) {
m_value = value;
for (auto func : valueChanged) {
func(value);
}
}
}
// Later on...
Counter a, b;
auto lambda = [&](int value) { b.setValue(value); };
a.valueChanged.push_back(lambda);
a.setValue(12);
b.setValue(48);
आप देख सकते हैं, कॉलबैक संस्करण टाइप-सुरक्षित और कम है:
// Header file
#include <QObject>
class Counter : public QObject
{
Q_OBJECT
public:
Counter() { m_value = 0; }
int value() const { return m_value; }
public slots:
void setValue(int value);
signals:
void valueChanged(int newValue);
private:
int m_value;
};
// .cpp file
void Counter::setValue(int value)
{
if (value != m_value) {
m_value = value;
emit valueChanged(value);
}
}
// Later on...
Counter a, b;
QObject::connect(&a, SIGNAL(valueChanged(int)),
&b, SLOT(setValue(int)));
a.setValue(12); // a.value() == 12, b.value() == 12
b.setValue(48); // a.value() == 12, b.value() == 48
यहाँ कि कोड कॉलबैक का उपयोग करके फिर से लिखा है क्यूटी संस्करण की तुलना में, despite them claiming that it's not। यह Counter
से अलग किसी भी नए वर्ग को परिभाषित नहीं करता है। यह केवल मानक लाइब्रेरी कोड का उपयोग करता है और काम करने के लिए एक विशेष कंपाइलर (moc) की आवश्यकता नहीं है। फिर, कॉलबैक पर सिग्नल और स्लॉट पसंदीदा क्यों हैं? क्या सी ++ 11 ने इन अवधारणाओं को आसानी से अप्रचलित कर दिया है?
धन्यवाद।
क्यूटी सी ++ 11 से बहुत पुराना है। क्यूटी दस्तावेज, श्वेतपत्र आदि में दावों को सी ++ 11 मानक के पहले "सी ++ के लिए बेहतर सी" के दावों के रूप में पढ़ा जाना चाहिए। विशेष रूप से मूर्खतापूर्ण दावों जैसे "कॉलबैक में दो मौलिक त्रुटियां होती हैं: सबसे पहले, वे टाइप-सुरक्षित नहीं होते हैं।" सी ++ के रूप में सी ++ के लिए बस कोई समझ न करें: इसे समझने के लिए शुद्ध सी प्रोग्रामिंग के संदर्भ में किसी को सोचना चाहिए। –
अवधारणाओं और "स्लॉट्स" अवधारणा के साथ "संकेतों और स्लॉट्स के क्यूटी के कार्यान्वयन" को स्वीकार न करें। जब कॉलबैक की सूची के रूप में कुछ बनाए रखा जाता है और जब कोई ईवेंट होता है तो उन्हें कॉल करता है। आपके पास सिग्नल और स्लॉट का सार है। बाकी सब कुछ चीनी, वाक्यविन्यास, और विपणन है। आपके पास जो कुछ है, वह सरल है, यदि सिग्नल और स्लॉट सिस्टम का कार्यान्वयन सरल है। – GManNickG
@GManNickG फिर मेरे कार्यान्वयन और क्यूटी के बीच क्या अंतर है? –