ठीक है, यह शायद कोड में वास्तव में एक सुंदर समाधान नहीं है, लेकिन यह आपके कार्य के इंटरफ़ेस में वास्तव में सुंदर है। और यह भी बहुत ही कुशल है। यह आदर्श है यदि दूसरा आपके लिए अधिक महत्वपूर्ण है (उदाहरण के लिए, आप एक पुस्तकालय विकसित कर रहे हैं)।
चाल यह है:
- एक लाइन
A a = b.make();
आंतरिक रूप से एक के एक निर्माता है, अर्थात जैसे कि आप A a(b.make());
लिखा था में बदल जाती है।
- अब
b.make()
को कॉलबैक फ़ंक्शन के साथ एक नई कक्षा का परिणाम होना चाहिए।
- यह पूरी चीज केवल कक्षाओं द्वारा बिना किसी टेम्पलेट के ठीक से संभाली जा सकती है।
मेरा न्यूनतम उदाहरण यहां दिया गया है। केवल main()
देखें, क्योंकि आप देख सकते हैं कि यह आसान है। आंतरिक नहीं हैं।
गति के दृष्टिकोण से: Factory::Mediator
वर्ग का आकार केवल 2 पॉइंटर्स है, जो 1 और अधिक नहीं है। और यह पूरी चीज में एकमात्र वस्तु है जिसे मूल्य द्वारा स्थानांतरित किया जाता है।
#include <stdio.h>
class Factory {
public:
class Mediator;
class Result {
public:
Result() {
printf ("Factory::Result::Result()\n");
};
Result(Mediator fm) {
printf ("Factory::Result::Result(Mediator)\n");
fm.call(this);
};
};
typedef void (*MakeMethod)(Factory* factory, Result* result);
class Mediator {
private:
Factory* factory;
MakeMethod makeMethod;
public:
Mediator(Factory* factory, MakeMethod makeMethod) {
printf ("Factory::Mediator::Mediator(Factory*, MakeMethod)\n");
this->factory = factory;
this->makeMethod = makeMethod;
};
void call(Result* result) {
printf ("Factory::Mediator::call(Result*)\n");
(*makeMethod)(factory, result);
};
};
};
class A;
class B : private Factory {
private:
int v;
public:
B(int v) {
printf ("B::B()\n");
this->v = v;
};
int getV() const {
printf ("B::getV()\n");
return v;
};
static void makeCb(Factory* f, Factory::Result* a);
Factory::Mediator make() {
printf ("Factory::Mediator B::make()\n");
return Factory::Mediator(static_cast<Factory*>(this), &B::makeCb);
};
};
class A : private Factory::Result {
friend class B;
private:
int v;
public:
A() {
printf ("A::A()\n");
v = 0;
};
A(Factory::Mediator fm) : Factory::Result(fm) {
printf ("A::A(Factory::Mediator)\n");
};
int getV() const {
printf ("A::getV()\n");
return v;
};
void setV(int v) {
printf ("A::setV(%i)\n", v);
this->v = v;
};
};
void B::makeCb(Factory* f, Factory::Result* r) {
printf ("B::makeCb(Factory*, Factory::Result*)\n");
B* b = static_cast<B*>(f);
A* a = static_cast<A*>(r);
a->setV(b->getV()+1);
};
int main(int argc, char **argv) {
B b(42);
A a = b.make();
printf ("a.v = %i\n", a.getV());
return 0;
}
मेरा ऑब्जेक्ट रेफरेंस नहीं होना चाहिए? –
आप यहां जवाब पा सकते हैं: http://stackoverflow.com/questions/3350385/how-to-return-an-object-in-c – MOHRE
आप यहां तरीकों को ढूंढ सकते हैं: http://stackoverflow.com/ प्रश्न/3350385/कैसे-टू-रिटर्न-ए-ऑब्जेक्ट-इन-सी – MOHRE