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 | 1402 (931) | nyler |
» | kako narediti program ki bere drugi programOddelek: Programiranje | 5940 (4253) | imagodei |
» | mfc problemOddelek: Programiranje | 1700 (1264) | FuI2cY |
» | C++ spiralno pisanje v arrayOddelek: Programiranje | 1491 (1242) | ghost |
» | C# je mozna referenca do int izven funkcije (direkt v classu torej)Oddelek: Programiranje | 1655 (1469) | TopCat |