Kezdőoldal » Számítástechnika » Programozás » C++-ban hogyan oldható meg,...

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?

Figyelt kérdés

É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]



2020. dec. 20. 14:33
1 2
 1/11 A kérdező kommentje:
Amíg nem pointereket akartam tárolni, hanem simán másoltam, a tömböt rajta végigiterálva és vec.push_back(arr[i])-vel, a vectort pedig sima inicializáló listával, addig lefordult. Csak épp nem a feladatnak megfelelően működött.
2020. dec. 20. 14:39
 2/11 anonim ***** válasza:

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.

2020. dec. 20. 15:03
Hasznos számodra ez a válasz?
 3/11 anonim ***** válasza:

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.

2020. dec. 20. 15:08
Hasznos számodra ez a válasz?
 4/11 A kérdező kommentje:

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.

2020. dec. 20. 15:12
 5/11 anonim ***** válasza:
Nincs olyan típus paraméterátadásnál, hogy tömb. Amit kapsz, az egy pointer. Lehet, hogy szögletes zárójelet látsz, de az egy pointer. A const char* is egy tömbre mutató pointer.
2020. dec. 20. 15:17
Hasznos számodra ez a válasz?
 6/11 A kérdező kommentje:

Ú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. :'(

2020. dec. 20. 15:22
 7/11 A kérdező kommentje:

error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]


:(

2020. dec. 20. 15:31
 8/11 anonim ***** válasza:
Figyu, tedd föl a pastebinre a forrást meg írd le a feladatot, mert 5x akkora meló a félinformációkból kitotózni, hogy mi a baj és mit kéne csinálni.
2020. dec. 20. 16:36
Hasznos számodra ez a válasz?
 9/11 A kérdező kommentje:

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

2020. dec. 20. 17:28
 10/11 anonim ***** válasza:

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.

2020. dec. 20. 17:31
Hasznos számodra ez a válasz?
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!