Gå til innhold

[Løst]Pointer til vector<class> - Hvordan løse dette?


Anbefalte innlegg

Hei, jeg har i det store og hele en lagt større kode som virker noelunde slik som under.

Jeg har en klasse, som er en private vector i en annen klasse.

 

Poenget er at jeg nå trenger å endre en verdi i den "innerste" klassen, og det gjennom en funksjon.

 

Tanken er å sende samlingen av samlinger inn via pointer eller reference, hva som enn virker mest

hensiktsmessig (or her er jeg i litt ukjent lende) for så å kunne ha tilgang til, og endre variabler

i den innerste klassen. Tingen er å endre verdiene i den opprinnelige vektoren, og ikke en i kopi som

går out of scope når funksjonen returnerer.

 

#include &--#60;iostream&--#62;
#include &--#60;vector&--#62;

using namespace std;

class myClass {
bool amIReal;

public:
void setReal(bool val) { amIReal = val; }
bool getReal(void) { return amIReal; }
};

class myClassCollection {
vector&--#60;myClass&--#62; myCollection;

public:
void setMyClassReal(int index, bool val) {
	myCollection[index].setReal(newVal);
}
};

int DoStuff(vector&--#60;myClassCollection&--#62; *);

int main () {
vector&--#60;myClassCollection&--#62; CollectionOfCollections;

DoStuff(&CollectionOfCollections);

return 0;
}

int DoStuff(vector&--#60;myClassCollection&--#62; *inVector) {
int first = 3;
int second = 1;
myClassCollection *accessToChange;

//Jeg øsnker å endre "amIReal"
accessToChange = &(inVector-&--#62;at(first));
(*accessToChange).setMyClassReal(second, true);
}

 

Dette er så langt den eneste måten jeg har fått drittet til å kompilere. Problemet er at endringer

gjort via DoStuff ikke er persistente. Endringene blir tydeligvis utført på en kopi som går out of

scope.

 

Så vidt jeg ser blir denne kopien opprettet ved call til inVector-&--#62;at() (returnerer en kopi av elementet,

og ikke elementet selv). Men jeg får det ikke til på andre måter og kommer rett og slett ikke på

noen løsninger på problemet ...

 

Noen ideer, eller løsninger? Helst noe som ikke innebærer å skrive om hele makkverket.

 

Mvh,

Beej80

Endret av Beej80
Lenke til kommentar
Videoannonse
Annonse

Prøv noe sånt:

#include <iostream> 
#include <vector> 

using namespace std; 

class myClass 
{
public: 
myClass(){}
void setReal(bool val) { amIReal = val; } 
bool getReal(void) { return amIReal; } 

private:
bool amIReal;
}; 

class myClassCollection { 
public: 
myClassCollection()
{
myCollection = new vector<myClass> (10);
}
void setMyClassReal(int index, bool val) { 
myCollection->at(index).setReal(val); }
bool getMyClassReal(int index) {
return myCollection->at(index).getReal(); }
private:
vector<myClass>* myCollection;

}; 



int main () { 
       vector<myClassCollection> CollectionOfCollections(1); 
	while(true){
	CollectionOfCollections.at(0).setMyClassReal(1,true);		
	cout << CollectionOfCollections.at(0).getMyClassReal(1);
	}

       return 0; 
} 

 

Hei, jeg har i det store og hele en lagt større kode som virker noelunde slik som under.

Jeg har en klasse, som er en private vector i en annen klasse.

 

Poenget er at jeg nå trenger å endre en verdi i den "innerste" klassen, og det gjennom en funksjon.

 

Tanken er å sende samlingen av samlinger inn via pointer eller reference, hva som enn virker mest

hensiktsmessig (or her er jeg i litt ukjent lende) for så å kunne ha tilgang til, og endre variabler

i den innerste klassen. Tingen er å endre verdiene i den opprinnelige vektoren, og ikke en i kopi som

går out of scope når funksjonen returnerer.

 

#include <iostream>
#include <vector>

using namespace std;

class myClass {
bool amIReal;

public:
void setReal(bool val) { amIReal = val; }
bool getReal(void) { return amIReal; }
};

class myClassCollection {
vector<myClass> myCollection;

public:
void setMyClassReal(int index, bool val) {
	myCollection[index].setReal(newVal);
}
};

int DoStuff(vector<myClassCollection> *);

int main () {
vector<myClassCollection> CollectionOfCollections;

DoStuff(&CollectionOfCollections);

return 0;
}

int DoStuff(vector<myClassCollection> *inVector) {
int first = 3;
int second = 1;
myClassCollection *accessToChange;

//Jeg øsnker å endre "amIReal"
accessToChange = &(inVector->at(first));
(*accessToChange).setMyClassReal(second, true);
}

 

Dette er så langt den eneste måten jeg har fått drittet til å kompilere. Problemet er at endringer

gjort via DoStuff ikke er persistente. Endringene blir tydeligvis utført på en kopi som går out of

scope.

 

Så vidt jeg ser blir denne kopien opprettet ved call til inVector->at() (returnerer en kopi av elementet,

og ikke elementet selv). Men jeg får det ikke til på andre måter og kommer rett og slett ikke på

noen løsninger på problemet ...

 

Noen ideer, eller løsninger? Helst noe som ikke innebærer å skrive om hele makkverket.

 

Mvh,

Beej80

Endret av Anders Hole
  • Liker 1
Lenke til kommentar
  • 3 uker senere...

Var litt usikker her jeg å, men det er noen ting jeg lurer på. Hvorfor prøver du å hente ut objekter fra en vektor, som er tom? Du fyller aldri noe inn i vektorene dine, du bare henter ut / skal endre. Du må enten allokere et nytt objekt, legge det inn i vektorene, eller gjøre det via constructorene (som just does not make sence)...

Lenke til kommentar
  • 1 måned senere...

Hei, beklager at det tok så lang tid å komme tilbake her.

 

Endte opp med at jeg endret en del dagen derpå for å bare komme meg videre, da det drøyde litt med svar.

 

Det er mulig at Anders Hole sin metode ville ha virket, men jeg har ikke prøvd det.

 

Valkyrex: Det var en form for psudo-kode i det opprinnelige innlegget. Vektorene var aldri tomme. Jeg gadd bare ikke inkludere flere hundre linjer med kode når det som står i det opprinnelige innlegget dekker spørsmålet (ref: svaret fra Anders Hole).

 

Tusen takk for hjelpen, uansett. Det er greit å se at det er folk der ute som er både villig og i stand til å hjelpe!

 

Mvh,

Beej80

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...