» »

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č:
    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 ()

Senitel ::

Boš imel luknje v indeksih?

mallard ::

@Matte, kaj pa pridobi z map?

MaTTe ::

mallard ne vem meni se zdi, da bi bilo za klicanje lažje ... :/

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:

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;

pizdarija1 ::

Tako ja RGB bo notri, bom vse sprobal pa se javim.
Zadnji struct odlično zgleda.

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 :)

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.

mallard ::

Privzeti dostop do članov je v classu private, v structu pa public. Pa še:
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 ::

Brane22 je izjavil:

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Java - DN] Naključna števila

Oddelek: Šola
121280 (809) nyler
»

kako narediti program ki bere drugi program

Oddelek: Programiranje
465402 (3715) imagodei
»

mfc problem

Oddelek: Programiranje
161541 (1105) FuI2cY
»

C++ spiralno pisanje v array

Oddelek: Programiranje
101369 (1120) ghost
»

C# je mozna referenca do int izven funkcije (direkt v classu torej)

Oddelek: Programiranje
81548 (1362) TopCat

Več podobnih tem