मैं सी ++ बिल्डर में इंटरफ़ेस इंस्टेंस की सूची कैसे बना सकता हूं? मैं निम्नलिखित कोशिश कर रहा हूं, लेकिन संकलक इनमें से प्रत्येक से अलग-अलग तरीकों से शिकायत करता है:

#include <System.Generics.Collections.hpp>
...
TList__1<IInterface> IntfList;
TList__1<_di_IInterface> IntfList;
TList__1<DelphiInterface<IInterface>> IntfList;

दूसरी ओर, मैं वस्तुओं के साथ सूची भी नहीं बना सकता।

TList__1<TObject> ObjList = new TList__1<TObject>();

तो मैं काफी खो गया हूँ, ऐसा लगता है, और डॉक्टर भी मदद नहीं करता है

http://docwiki.embarcadero.com/Libraries/Sydney/en/System.Generics.Collections.TList

या क्या कोई वैकल्पिक तरीका है जो बेहतर काम करेगा? आखिरकार, मुझे एक सरणी की आवश्यकता होगी, लेकिन मैं इसे Add का उपयोग करके गतिशील रूप से बनाना चाहता हूं, और फिर इसे IntfList->ToArray() से प्राप्त करना चाहता हूं।

0
Jouni Aro 15 फरवरी 2021, 19:42

1 उत्तर

सबसे बढ़िया उत्तर

सबसे पहले, TList<T> एक डेल्फ़ी TObject-व्युत्पन्न वर्ग है, इसलिए इसे C++ में new के माध्यम से गतिशील रूप से बनाया जाना चाहिए, उदाहरण के लिए:

TList__1<T> *MyList = new TList__1<T>;
...
delete MyList;

जहां T _di_IInterface, TObject* (* पर ध्यान दें) आदि हो सकते हैं।

अब ऐसा कहा जा रहा है...

मैं सी ++ बिल्डर में इंटरफ़ेस इंस्टेंस की सूची कैसे बना सकता हूं?

संक्षेप में, आप शुद्ध C++ कोड में TList<T> के साथ ऐसा नहीं कर सकते। यह प्रलेखित व्यवहार है:

C++ में डेल्फी जेनरिक को कैसे हैंडल करें?

डेल्फी जेनरिक टेम्पलेट्स के रूप में सी ++ के संपर्क में हैं। हालांकि, यह महसूस करना महत्वपूर्ण है कि तत्कालता डेल्फी पक्ष पर होती है, सी ++ में नहीं। इसलिए, आप इन टेम्प्लेट का उपयोग केवल उन प्रकारों के लिए कर सकते हैं जिन्हें स्पष्ट रूप से डेल्फ़ी कोड में तत्काल किया गया था

...

यदि C++ कोड उन प्रकारों के लिए डेल्फी जेनेरिक का उपयोग करने का प्रयास करता है जो डेल्फी में तत्काल नहीं थे, तो आपको लिंक समय पर त्रुटियां मिलेंगी।

नेटिव RTL या VCL/FMX फ्रेमवर्क में TList<IInterface> का कोई डिफ़ॉल्ट इंस्टेंटेशन नहीं है। तो आपको इस तरह की तात्कालिकता बनाने के लिए अपने सी ++ बिल्डर प्रोजेक्ट में अपना खुद का डेल्फी कोड जोड़ना होगा, उदाहरण के लिए:

MyTListInstantiationUnit.pas

unit MyTListInstantiationUnit;

interface

{$HPPEMIT '#pragma link "MyTListInstantiationUnit"'} 

// or in XE5 Update 2 and later:
// {$HPPEMIT LINKUNIT}

implementation

uses
  System.Generics.Collections;

initialization
  TList<IInterface>.Create.Free;
finalization

end.

MyCppUnit.cpp

#include <System.Generics.Collections.hpp>
#include "MyTListInstantiationUnit.hpp"
...
TList__1<_di_IInterface> *IntfList = new TList__1<_di_IInterface>; // should work now

अन्यथा, आप इसके बजाय TInterfaceList का उपयोग कर सकते हैं:

#include <System.Classes.hpp>
...
TInterfaceList *IntfList = new TInterfaceList;
...
delete IntfList;

या, यदि आपको वास्तव में C++/Delphi सीमा के पार एक इंटरफ़ेस सूची पास करने की आवश्यकता नहीं है, तो इसके बजाय std::vector जैसे शुद्ध-C++ कंटेनर का उपयोग करने पर विचार करें:

#include <vector>
...
std::vector<_di_IInterface> IntfList;

जहां तक ​​TList<TObject> का संबंध है, यह वास्तव में मूल डेल्फ़ी आरटीएल में मौजूद है, लेकिन यह आपके लिए केवल इसलिए काम नहीं कर रहा है क्योंकि आप इसका सही उपयोग नहीं कर रहे हैं। इसके बजाय इसे और अधिक दिखने की जरूरत है:

TList__1<TObject*> *ObjList = new TList__1<TObject*>;
...
delete ObjList;

अन्यथा, आप इसके बजाय TObjectList का उपयोग कर सकते हैं, उदाहरण:

#include <System.Contnrs.hpp>
...
TObjectList *ObjList = new TObjectList;
...
delete ObjList;

या, इसके बजाय केवल std::vector<TObject*> का उपयोग करें।

1
Remy Lebeau 15 फरवरी 2021, 23:01
धन्यवाद @RemyLebeau, मैं वास्तव में हमारे डेल्फी पुस्तकालय के लिए सी ++ उदाहरणों के साथ संघर्ष कर रहा हूं और इस तरह के सभी प्रकार के मुद्दे आगे आते हैं, जहां मुझे कोई सुराग नहीं है। यह इसे समझाता है, और मैं चाहता हूं कि TList के लिए प्रलेखन उस लेख की ओर भी इशारा कर रहा होता। - तो मेरी डेल्फी कक्षा एक डायनामिकएरे की अपेक्षा करती है - अगर मैं आपको सही पढ़ता हूं, तो इसे बनाने का कोई साफ तरीका नहीं है, सिवाय इसके कि सरणी से शुरू करने के अलावा?
 – 
Jouni Aro
15 फरवरी 2021, 22:53
डायनामिकएरे के साथ काम करने के लिए आपको टीएलआईस्ट की आवश्यकता नहीं है। वे पूरी तरह से अलग चीजें हैं। लेकिन हाँ, यदि आपको एक डायनामिकअरे में पास करने की आवश्यकता है, तो आपको इसे आवश्यकतानुसार बनाना और भरना होगा, जैसे: DynamicArray<_di_IMyInterface> arr; arr.Length = ...; /* fill arr ... */ MyComponent->DoSomething(arr);
 – 
Remy Lebeau
15 फरवरी 2021, 23:03
हाँ, बेशक मुझे पता है। लंबाई को पहले से परिभाषित किए बिना भरने के लिए टीएलआईस्ट अधिक सुविधाजनक है। इसलिए मैं इसे डेल्फी उदाहरण में इस्तेमाल कर रहा था, जिसे मैं दोहराने की कोशिश कर रहा हूं। लेकिन मैं बिना करूँगा। इसे साफ़ करने के लिए टीएक्स।
 – 
Jouni Aro
15 फरवरी 2021, 23:49
"TList लंबाई को पहले से परिभाषित किए बिना भरना अधिक सुविधाजनक है" - जब तक आपको डेल्फी कोड के साथ बातचीत करने की आवश्यकता नहीं है, मैं उसके लिए केवल std::vector का उपयोग करूंगा।
 – 
Remy Lebeau
17 फरवरी 2021, 22:17
हाँ, यह उदाहरण कोड है जो डेल्फी घटकों के साथ इंटरैक्ट करता है, इसलिए यह एक डायनामिकएरे की अपेक्षा करता है। क्या एसटीडी-प्रकारों को डेल्फी(?) मुझे लगता है कि डायनामिकएरे एक डेल्फी प्रकार है, है ना?
 – 
Jouni Aro
17 फरवरी 2021, 22:43