Avatar billede it-dyret Nybegynder
22. maj 2002 - 17:53 Der 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??
Avatar billede chries Nybegynder
22. maj 2002 - 18:44 #1
jeg er ikke helt med på dit spørgsmål, er der noget galt i at bruge default containeren ?:

class TestClass
{
public:
    TestClass( int i ) { m_nVar = i; }

    int m_nVar;
};

int _tmain(int argc, _TCHAR* argv[])
{
    using namespace std;

    queue< TestClass* >* input = new queue< TestClass* >;

    input->push( new TestClass(10) );
    input->push( new TestClass(11) );
    input->push( new TestClass(12) );

    while (!input->empty())
    {
        TestClass *p = input->front();
        cout << p->m_nVar << endl;
        input->pop();
    }
    return 0;
}
Avatar billede chries Nybegynder
22. maj 2002 - 18:47 #2
måske skulle jeg også delete dem igen =)

    while (!input->empty())
    {
        TestClass *p = input->front();
        cout << p->m_nVar << endl;
        input->pop();
        delete p;
    }
    delete input;
Avatar billede it-dyret Nybegynder
22. maj 2002 - 19:07 #3
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???

Altså udfylde felterne med '?'

?returtype? MyQueueBuilder::MyQueueBuilder(){
  ...
  return input;
}

void MyQueueHandler::MyQueueHandler( ?input? ){
  ...
}
Avatar billede chries Nybegynder
22. maj 2002 - 21:13 #4
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:

#include <queue>
#include <list>
#include <iostream.h>

using namespace std;

// 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 );

    delete myQueue;

    return 0;
}
Avatar billede chries Nybegynder
22. maj 2002 - 21:15 #5
private:
    queue< TestClass* > *m_myQueue;

skal ikke lige være i QueueCreator, ignorer det.
Avatar billede it-dyret Nybegynder
22. maj 2002 - 21:33 #6
Cool, der er noget at gå i gang med, kan jeg se! :)

Jeg kaster mig ud i det, og vender tilbage senere... Er du online hele aftenen??
Avatar billede it-dyret Nybegynder
22. maj 2002 - 21:45 #7
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(){
}
Avatar billede it-dyret Nybegynder
22. maj 2002 - 21:47 #8
Der kommer nemlig en lang række fejl... Det er ligesom om, at den ikke kan finde ud af, at metoden overhovedet eksisterer :(

Har du et bud på hvorfor??
Avatar billede it-dyret Nybegynder
22. maj 2002 - 21:53 #9
Første #include i kommentar kl 21:45:32 skulle naturligvis se sådan ud:
#include<queue>
Avatar billede chries Nybegynder
23. maj 2002 - 08:57 #10
har du husket:
using namespace std;

både i .cpp og .h filerne ?
Avatar billede it-dyret Nybegynder
23. maj 2002 - 09:29 #11
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...

Har du et bud?
Avatar billede chries Nybegynder
23. maj 2002 - 09:40 #12
du har defineret din AvlTree::printQueue i header fil classen, men den dindes ikke som kode.

jeg ville tro du har glemt AvlTree:: foran din funktion i cpp filen. hvis ikke, prøv at poste din kode (hvis det ikke fylder for meget)
Avatar billede chries Nybegynder
23. maj 2002 - 09:41 #13
..findes ikke som...
Avatar billede it-dyret Nybegynder
23. maj 2002 - 09:45 #14
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)"??
Avatar billede chries Nybegynder
23. maj 2002 - 09:57 #15
angående templates, så skal de kodes i "header filerne". du kunne lige så godt omdøbe din template cpp fil til h :-)

http://www.mike95.com/c_plusplus/tutorial/templates/class_member.asp

..
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.

fil i.h:
int i = 100;

int doubleup( int i )
{
  return i+i;
}

xx fil:

#include "y.h"
#include "i.h"

kode...


svarer til at du havde skrevet i xx filen:

#include "y.h"

int i = 100;

int doubleup( int i )
{
  return i+i;
}

kode...
Avatar billede it-dyret Nybegynder
23. maj 2002 - 10:04 #16
Jeg bøjer mig i støvet og takker mange gange!!! Det har været en kæmpehjælp!!!
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester