Avatar billede conrad Nybegynder
04. november 2003 - 20:48 Der er 12 kommentarer og
1 løsning

Dynamisk oprettelse af objekter

Dette spørgsmål relaterer i nogen grad til http://www.eksperten.dk/spm/422943
men jeg synes alligevel det "fortjener" sit eget spørgsmål.

Jeg har brug for at få afklaret om jeg har forstået nogle ting korrekt

1) Initialisering af objekt som Obj o; gør at objektet oprettes på stacken. Man kan IKKE oprette objekter dynamisk med Obj o, men kun med Obj *o = new Obj();

2) Hvordan bør følgende metode så se ud (såfremt påstand i 1 er korrekt) Metoden skal dynamisk oprette ACKData objekter. 

void ACKMonitor::addACK(int ackid,nsaddr_t route[],int rl, Time send_at)
{
    ACKData temp(ackid,route,rl, send_at);//GÅR IKKE
    acks[ackid] = temp;
}

acks er et map?
Avatar billede jpk Nybegynder
04. november 2003 - 20:52 #1
det skal vel være noget lign.:

void ACKMonitor::addACK(int ackid,nsaddr_t route[],int rl, Time send_at)
{
    acks[ackid] = new ACKData(ackid,route,rl, send_at);
}
Avatar billede jpk Nybegynder
04. november 2003 - 20:53 #2
hvor acks er et map af <int, ACKData*>
Avatar billede jpk Nybegynder
04. november 2003 - 20:54 #3
men du skal huske selv at kalde delete på hver entry i mappet når du ikke skal bruge dine data længere!
Avatar billede conrad Nybegynder
04. november 2003 - 20:57 #4
void ACKMonitor::addACK(int ackid,nsaddr_t route[],int rl, Time send_at)
{
     
    acks[ackid] = new ACKData(ackid,route,rl, send_at);
    //could possibly do a sweep for old ACKs here!
    cout << "Scanning for old ACKS...." << endl;
    this->scanForOldACKs();   
    cout << "Finished scanning for old ACKS...." << endl;
}

og så ændre typen af map fra map<int,ACKData> til map<int,ACKData>?

Grunden til jeg ikke bare "prøver mig frem" er at jeg mangler noget helt grundlæggende forståelse her, som jeg håber en ekspert kan hjælpe med
Avatar billede conrad Nybegynder
04. november 2003 - 20:57 #5
jpk - du er hurtig - men kan du sige hvad resultatet af den oprindelige metode vil blive?
Avatar billede jpk Nybegynder
04. november 2003 - 21:02 #6
Det kommer sansynligvis an på inplementationen af map'et.
Hvis ACKData har en copy-constructor/assignment operator vil det muligvis gå godt...
Avatar billede jpk Nybegynder
04. november 2003 - 21:04 #7
Hvordan er acks defineret?
Avatar billede conrad Nybegynder
04. november 2003 - 21:10 #8
Således:

ACKData::ACKData(int aid,nsaddr_t r[],int rl, Time sat)
{
    this->ackid = aid;//id of this ACK
    this->route_l = rl;//lenght of array
  //do some copying here
    for(int i = 0; i < rl; i++)
    {
      this->route.push_front(r[i]);
    }
    this->sendat=sat;//time we send this ACK
}

og jeg har ikke defineret copy eller = operatorer!

ps vil en map.remove(key) ikke fjerne korrekt ? eller skal jeg selv kalde delete map[key]?
Avatar billede jpk Nybegynder
04. november 2003 - 21:17 #9
Hvis du har kaldt new skal du også kalde delete!
Avatar billede jpk Nybegynder
04. november 2003 - 21:18 #10
Men du har lige vist constructoren for ACKData, ikke hvordan map'et acks bliver defineret!
Avatar billede conrad Nybegynder
04. november 2003 - 21:46 #11
map<int,ACKData>
Avatar billede conrad Nybegynder
05. november 2003 - 10:29 #12
har ændret det til acks[ackid] = new ACKData(ackid,route,rl, send_at);
og map til map<int,ACKData*>, tak for hjælpen jpk
Avatar billede jpk Nybegynder
05. november 2003 - 10:35 #13
Husk at slette elementer før pointeren overskrives (hvis det kan ske altså)
det kunne fx være sådan:

void ACKMonitor::addACK(int ackid,nsaddr_t route[],int rl, Time send_at)
{
    if(acks[ackid] != NULL) // Forudsætter at en map entry er NULL hvis den ikke er sat!
        delete acks[ackid];
    acks[ackid] = new ACKData(ackid,route,rl, send_at);
}
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





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis