Forum » Programiranje » c++ two dimensional array v classu
c++ two dimensional array v classu
pizdarija1 ::
Zdravo, imam problem hočem narest dvo-dimenzionalni array pa mi v classu nikakor noče delat, sem prilepil del kode..
class colorPallete{ int colors[][3]; public: colorPallete(int x, int y); }; colorPallete::colorPallete(int x, int y){ colors[][3] = { {0,255,255}, {0,0,0}, {141,129,0}, {255,0,0}, {255,244,0}, {43,94,208}, {76,69,0}, {39,157,58}, {255,8,8}, {0,208,0}, {43,208,90}, {210,21,21} }; }
mallard ::
Tega ni mogoče naredit tako, kot si se ti lotil. Cel kup problemov:
Prvič:
Drugič, polje lahko inicializiraš, ne moreš mu pa dodelit vsebine:
Tretjič, ko tok programa doseže telo konstruktorja, so podatkovni člani razreda že inicializirani:
Četrti problem: brez prevajalnika, ki podpira standard C++11, ne moreš inicializiriat polja v sami deklaraciji razreda.
Torej, če nimaš C++11 prevajalnika, je ena alternativa:
Ampak, za božjo voljo, uporabi std::vector (sploh, če boš kdaj spreminjal velikost polja). Lažje ti bo tudi, npr. prestavit vrednosti v neko datoteko in jih prebrat v vektorje.
Prvič:
int arr[][3]; // polja ni dovoljeno deklararitat brez da mu določiš velikost (manjka ti velikost prve dimenzije). // Razen, če: int arr[][3] = {{1,2,3},{4,5,6}}; // V tem primeru lahko prevajalnik sam pogrunta velikost dimenzije (2, v tem primeru).
Drugič, polje lahko inicializiraš, ne moreš mu pa dodelit vsebine:
int arr[3] = {1,2,3}; // v redu, inicializacija arr = {4,5,6}; // error, assignment to an array (ali nekaj v tem smislu)
Tretjič, ko tok programa doseže telo konstruktorja, so podatkovni člani razreda že inicializirani:
class test { int arr[3]; publoc: test() { arr = {1,2,3}; // enako kot v drugi točki, error } // za inicializacijo v kostruktorju moraš uporabit initializer list. // V C++11 lahko napišeš takole: test() : arr {1,2,3} { } };
Četrti problem: brez prevajalnika, ki podpira standard C++11, ne moreš inicializiriat polja v sami deklaraciji razreda.
class test { int arr[3] = {1,2,3}; // napaka v C++03 };
Torej, če nimaš C++11 prevajalnika, je ena alternativa:
class colorPallete{ int colors[3][3]; public: colorPallete(int x, int y); }; colorPallete::colorPallete(int x, int y){ colors[0][0] = 0; colors[0][1] = 255; colors[0][2] = 255; colors[1][0] = 0; colors[1][1] = 0; colors[1][2] = 0; colors[2][0] = 141; colors[2][1] = 129; colors[2][2] = 0; // itd... }
Ampak, za božjo voljo, uporabi std::vector (sploh, če boš kdaj spreminjal velikost polja). Lažje ti bo tudi, npr. prestavit vrednosti v neko datoteko in jih prebrat v vektorje.
MaTTe ::
mallard kaj pa, če bi potem kar mape (KLIK) uporabil?
Zgodovina sprememb…
- spremenilo: MaTTe ()
mallard ::
Map je asociativen kontejner, vsebuje pa pare ključ/vrednost (key/value pairs). Tukaj ni smiseln, IMHO. Zdaj mi je šele kapnilo, da OP želi shranjevat (domnevam) RGB vrednosti barv. Potem bi jaz definiral svoj razred:
namesto polja pa preprosto:
struct RGB { RGB() : red(0), green(0), blue(0) {} RGB(uint8_t r, uint8_t g, uint8_t b) : red(r), green(g), blue(b) {} // itd... private: uint8_t red, green, blue; };
namesto polja pa preprosto:
std::vector<RGB> colors;
MaTTe ::
mallard imaš prav glede map ja, samo v tistem trenutku se mi je zdela dobra ideja :D
Na razred pa sploh pomislil nisem je pa dejansko najbolj preprosto za napravit :)
Na razred pa sploh pomislil nisem je pa dejansko najbolj preprosto za napravit :)
Brane22 ::
@mallard:
struct se obnaša skoraj kot razred, ampak a ne bi bilo bolje uporabit class ?
Poleg tega, če uporabi strcuct/class, a ne bo potem vsak element obremenjen z naslovi za klice konstruktorjev in member funkcij ?
Mislim, RGB trojček vzame 3 byte. Vsak pointer je pa na 64-bitni mašini 8 byteov in tam imaš dva konstruktorja in vsaj 3 funkcije.
Ajde, eden bi lahko bil totalka komot pokrajšan z optimizacijo, ampak ostanejo ti vsaj štirje. Če definiraš funkcije znotraj classa, so te inlineane a ne verjamem,d a so manjše od samega pointerja.
struct se obnaša skoraj kot razred, ampak a ne bi bilo bolje uporabit class ?
Poleg tega, če uporabi strcuct/class, a ne bo potem vsak element obremenjen z naslovi za klice konstruktorjev in member funkcij ?
Mislim, RGB trojček vzame 3 byte. Vsak pointer je pa na 64-bitni mašini 8 byteov in tam imaš dva konstruktorja in vsaj 3 funkcije.
Ajde, eden bi lahko bil totalka komot pokrajšan z optimizacijo, ampak ostanejo ti vsaj štirje. Če definiraš funkcije znotraj classa, so te inlineane a ne verjamem,d a so manjše od samega pointerja.
mallard ::
Privzeti dostop do članov je v classu private, v structu pa public. Pa še:
V tem je vsa razlika med classom in structom. V vseh ostalih pogledih se obnašata popolnoma enako. Katerega boš izbral je bolj stvar stila.
Ne vem točno, kaj misliš z "obremenjenimi" elementi. Sizeof(RGB) je 3, nič več. Struct/razred ne vsebuje nobenih kazalcev na metode, če si to mislil? (Če imaš virtualne metode, je druga pesem).
struct derived1 : base1 {}; // dedovanje je public po defaultu class derived2 : base2 {}; // dedovanje je private po defaultu
V tem je vsa razlika med classom in structom. V vseh ostalih pogledih se obnašata popolnoma enako. Katerega boš izbral je bolj stvar stila.
Ne vem točno, kaj misliš z "obremenjenimi" elementi. Sizeof(RGB) je 3, nič več. Struct/razred ne vsebuje nobenih kazalcev na metode, če si to mislil? (Če imaš virtualne metode, je druga pesem).
Senitel ::
Poleg tega, če uporabi strcuct/class, a ne bo potem vsak element obremenjen z naslovi za klice konstruktorjev in member funkcij ?
Mislim, RGB trojček vzame 3 byte. Vsak pointer je pa na 64-bitni mašini 8 byteov in tam imaš dva konstruktorja in vsaj 3 funkcije.
Ajde, eden bi lahko bil totalka komot pokrajšan z optimizacijo, ampak ostanejo ti vsaj štirje. Če definiraš funkcije znotraj classa, so te inlineane a ne verjamem,d a so manjše od samega pointerja.
Ne. Metode niso del instance ampak so skupne "nekje posebej". Edino kar lahko fašeš zraven je vtable.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [Java - DN] Naključna številaOddelek: Šola | 1364 (893) | nyler |
» | kako narediti program ki bere drugi programOddelek: Programiranje | 5772 (4085) | imagodei |
» | mfc problemOddelek: Programiranje | 1650 (1214) | FuI2cY |
» | C++ spiralno pisanje v arrayOddelek: Programiranje | 1453 (1204) | ghost |
» | C# je mozna referenca do int izven funkcije (direkt v classu torej)Oddelek: Programiranje | 1617 (1431) | TopCat |