C++-ban hogyan oldható meg, hogy ha egy class kívülről kap vectort vagy tömböt és utána a külső változik, a belső is változzon?
Én csak azt a class-t írhatom meg, amelyik a vectort vagy a tömböt kapja. Akármelyiket is kapja, én jelenleg egy vectorban tárolom az értékeket.
Van, ahol létrehoz egy tömböt vagy vectort, az általam megírandó class adott objektuma az const.
Tehát: const my_class<int> my_class(/*paraméterek: vector vagy array, ez utóbbi a hosszával együtt ugyebár és const-ok*/); lényegében
Van, ahol létrehoz egy tömböt vagy vectort, az általam megírandó class nem const. Az eredeti vectort vagy tömböt módosítja és az én osztályomban levőnek is módosulnia kell ezzel párhuzamosan.
Tehát: my_class<int> my_class(/*paraméterek: vector vagy array*/); // semmi se const
Megpróbáltam úgy, hogy én az eredeti, külsőre mutató pointereket tárolok egy vectorra, tehát rendre a külső tömb/vector memóriacímeit tárolom el.
Így viszont a const miatt rinyál:
error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
Rossz szerintem a megközelítésed. Van neked egy általad nem piszkálható konstans pointer (Itt figyelned kell arra, hogy a pointer konstans, vagy az általa mutatott érték).
Ezt a konstans pointert konstruktorban inicializálod, és eltárolod az osztályban.
Utána ha azt dereferálod, az az eredetire mutat, így mindegy hogy const-e vagy nem, ha nem írod át. Nem tudom konkrétan mi a feladat, de véleményem szerint nem rendelkezik olyanról a feladat, hogy neked még egy vectorba másolgatnod kéne. Ilyet nem csinál programozó. Főleg, hogy nincsen rá lehetőség, hogy külső változó változására feliratkozzunk igazán.
Másold be a feladat pontos szövegét.
Ha jól értem, pointerként kapod meg a vector objektumot. Ezt a pointert kell eltárolnod. Így a te pointered ugyanarra a vector objektumra fog mutatni, amit kaptál, nem jön létre új. Ha módosul, akkor látni fogja az osztályod a módosított verziót, hiszen ugyanazt a memóriaterületet nézi. Ez megvalósítható, ha neked nem fordul, akkor valami gond van a szintaxissal. Macerás egy ilyet kibigyózni, de ez van, az elején ezzel szerencsétlenkedik az ember egy darabig. Amúgy addig örülj, amíg az a gond hogy nem fordul - a rosszabb eset az, hogy fordul, aztán kapsz egy nagy segfaultot. Azt az igazán macerás kidebugolni.
Ugyanez referenciákkal is kivitelezhető, de ha még nem hallottál róla, akkor egyelőre maradj a pointernél.
Ha lemásolod magadnak a vektor tartalmát, az nem jó ebben az esetben, hiszen az olyan lesz, mint egy biztonsági másolat. Nem fog magától felülíródni, csak azért, mert az eredetijét módosították.
Nem pointert kapok, hanem sima tömböt a hosszával együtt, a másik túlterhelésben pedig sima vectort. Totál simát. Egy helyen pedig const char * -ot.
Az osztályom vagy a const kulcsszóval van példányosítva, vagy anélkül. Na amikor anélkül, akkor kell létrejönnie a változásnak.
Azt kigugliztam, hogy a push_back()-el nem lehet konstans pointert átadni vectornak. Jó, a fordító is ezt írta lényegében, de a guglizással jobban értettem.
Úgy is írtam a saját osztályomban asszem. A vectort-t meg simán, de azt tényleg simán adja át és úgy tudom, cpp-ben nem olyan, mint Java-van vagy C#-ban, nem automatikusan referenciaként adódik át a vector, hanem simán érték szerint. Ott akadok meg.
Viszont főleg a const-ozásnál, mert létrehozom az
std::vector<t *> vec; -et és nem tudok mindent push_back(&arr[i]) vagy épp push_back(&vec[i]) módszerrel hozzáadni, mert a const miatt őrjöng. Amit ha jól olvastam a neten, jogosan őrjöng, csak akkor én mit csináljak?
Az már más kérdés, hogy a másik metódusban nem engedi, hogy ezt csináljam: foo(*vec[i]);
nade előbb az első gondot kell megoldani. :'(
error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
:(
Tudom, csak sulis feladat, ezt nem mertem. :(
Végül úgy néz ki, sikerült megoldani. Eléggé undorító megoldással, van egy const pointeres vector meg egy sima pointeres vector. :D
Kérheted referencia szerint vectort a függvényedben, aztán nem számít, hogy "simán" adja át.
void foo(std::vector<Kiskutya> &myVector)
{
...
}
A tömb esetében meg alapból egy pointerrel többnyire ekvivalens dolgot kapsz, szóval ott az eredeti tömbre hivatkozol.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!