22. maj 2002 - 17:53Der er
15 kommentarer og 1 løsning
Queue i C++
Jeg er ved at lave en queue i C++ og har en række spørgsmål til opbygning af en sådan... Jeg kan se, at den skal bygger ovenpå andre datastrukturer som f.eks. list og deque.
Til at starte med har jeg problemet med selve syntaksen. Jeg kan godt lave en kø (tror jeg) til at indeholde MyItems ved følgende syntaks:
queue< list<MyItems> >* input = new queue< list<MyItems> >;
men kan ikke bruge
queue< list<MyItems> >*
som returtype ved metoden som skal fylde MyItems i køen. Hvad gør jeg galt??
Nej, der er vel ikke noget galt i at bruge default containeren... faktisk lyder det som en glimrende ide!!! Men da jeg ikke er bekendt med syntaksen og standardklasserne - og derfor koder ud fra, hvad jeg lige har læst - sker det ind imellem (ja, ok - ofte), at jeg udsætter mig selv for en solo-ulykke ;)
Jeg roder lige lidt med dit eksempel og vender tilbage...
Imellemtiden kan du måske forklare, hvordan jeg rent syntaks-mæssigt skal skrive, hvis jeg vil have listen i en klasse, returnere den derfra og sende den med som parameter i en anden klasse???
her er nogle eksempler, hvis du skal have nogle uddybende forklaringer, sig til. Jeg har ikke lige taget mig af at slette elemeter jeg pusher på kø'erne:
// test class class TestClass { public: TestClass( int i ) { m_nVar = i; }
int m_nVar; };
// contains and manipulates with que class QueueContainer { public: QueueContainer() {
m_myQueue = new queue< TestClass* >; }
~QueueContainer() { delete m_myQueue; }
// retuner pointer til member variabel queue< TestClass* >* GetQueue() { return m_myQueue; }
private: queue< TestClass* > *m_myQueue; };
// creates and returns queue class QueueCreator { public: // opretter que og returner den oprettede queue< TestClass* >* CompileQue() { queue< TestClass* > * myQueue = new queue< TestClass* >;
myQueue->push( new TestClass(10) ); myQueue->push( new TestClass(11) ); myQueue->push( new TestClass(12) ); myQueue->push( new TestClass(13) ); myQueue->push( new TestClass(14) );
return myQueue; }
private: queue< TestClass* > *m_myQueue; };
// takes pointer to queue class QueueInput { public: QueueInput(queue< TestClass* > *pInput ) { pInput->push( new TestClass(10) ); } };
int _tmain(int argc, _TCHAR* argv[]) { // giv que indeholdt i queContainer til queInput // queInput manipuler med queContainer's que QueueContainer queContainer; QueueInput queInput(queContainer.GetQueue());
// giv que fra queCreator til queInput2 QueueCreator queCreator; queue< TestClass* > *myQueue = queCreator.CompileQue(); QueueInput queInput2( myQueue );
Jeg har lige et spørgsmål... jeg kan se, at du skriver det hele ud i et - uden opdeling i headerfil og cpp-fil.
Jeg får en fejl, når jeg arbejder med denne opdeling, hvor jeg skriver: I headerfilen: #include(queue) class MyClass { public: queue< MyItem* >* MyMethod(); };
I cpp-filen: #include"MyClass.h" queue< MyItem* >* MyClass::MyMethod(){ }
Nej, det havde jeg ikke... nu kan den fint compilere, men ikke linke. Der kommer følgende fejl: Main.obj : error LNK2001: unresolved external symbol "public: void __thiscall AvlTree::printQueue(class std::queue<class TreeNode *,class std::deque<class TreeNode *,class std::allocator<class TreeNode *> > > *)" (?printQueue@AvlTree@@QAEXPAV?$queue @PAVTreeNode@@V?$deque@PAVTreeNode@@V?$allocator@PAVTreeNode@@@std@@@std@@@std@@@Z)
Jeg har tidligere haft lignende fejl, hvor det kunne fikses ved at include en cpp-fil i stedet for en h-fil... Umiddelbart, ser det dog ikke ud til at kunne fikse problemet... Jeg kan i hvert ikke lige se, hvor det skulle være...
Du har fuldstændig ret!!! Jeg ved ikke lige, hvordan jeg kunne overse det...
Det kan være, at du også kan svare på et sidste spørgsmål: "Hvordan kan det være, at man skal include cpp-filen i stedet for header-filen, når man arbejder med templates (eksemplet, som blev nævnt ovenfor)"??
.. Implementing template member functions is somewhat different compared to the regular class member functions. Due to the way most compilers compile template based C++ code, the declarations and definitions of the class template member functions should all be in the same header file. In fact, for large projects where a template library is used in more than one location, the declarations and definitions need to be in the same header file. Consider the following ..
så lige lidt om include: include gør ikke andet end at sætte indholdet i det du includerer ønsert i din fil.
Jeg bøjer mig i støvet og takker mange gange!!! Det har været en kæmpehjælp!!!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.