[ maxmagnus2 @ 15.09.2004. 13:46 ] @
Pozdrav svima, prave mi problem nizovi u okviru klase. Deklarisu se ok ali ne mogu da ih pozovem Ime_Klase.Ime_Niza[Redni_Br] ne moze da ga pozove. Koja je sintaksa za ovo? |
[ maxmagnus2 @ 15.09.2004. 13:46 ] @
[ Mrav @ 15.09.2004. 14:59 ] @
Kako je deklarisan niz u okviru klase (public, private)?
Kakve konkretne greške ti prijavljuje kompajler? [ filmil @ 15.09.2004. 17:19 ] @
Citat: Ime_Klase.Ime_Niza[Redni_Br] ne moze da ga pozove. Ovako na neviđeno bih rekao da je problem što referišeš ime klase a ne ime instance. Takođe, ako je u pitanju ime klase, onda se za pristup koristi operator :: a sam niz mora da bude statički i (verovatno) javan. Međutim, kako je to loš dizajn, verovatno greška postoji i mnogo pre. Kažem, pošalji primer da vidimo šta je po sredi. f [ maxmagnus2 @ 16.09.2004. 10:43 ] @
Kod izgleda ovako:
#include<iostream.h> #include<math.h> class Matrica { public: float niz[16]; Matrica(float niz[16]); }; Matrica::Matrica(float niz_unos[]) {for(int i=0;i<16;i++) niz=niz_unos; } void main() { float Niz_Probni[16]={ 1,2,3,4, 3,7,2,1, 5,6,1,3, 3,2,1,1}; Matrica M(Niz_Probni); for(int i=0;i<16;i++) cout<<" "<<Matrica.niz[1]; } [ janjam @ 16.09.2004. 11:44 ] @
Kao sto rece filmil - referišeš ime klase a ne ime instance...
Probaj ovako: Code: class Matrica { public: float niz[16]; Matrica(float niz[16]); }; Matrica::Matrica(float niz_unos[]) { for(int i=0;i<16;i++) niz[i]=niz_unos[i]; } void main() { float Niz_Probni[16]={ 1,2,3,4, 3,7,2,1, 5,6,1,3, 3,2,1,1}; Matrica *M; M = new Matrica(Niz_Probni); for(int i=0;i<16;i++) cout<<" "<<M->niz[i]; } Ovo ti je sa minimalnim izmenama tvog koda, mada ovo moze i malo elegantnije da se odradi. [ idb @ 16.09.2004. 12:01 ] @
Evo nekih minimalnih izmena (naznacene sa !!!!) da ti program proradi:
Code: #include <iostream> #include <cstdlib> using namespace std; class Matrica{ public: float niz[16]; Matrica(float niz[16]); }; Matrica::Matrica(float niz_unos[]){ for(int i=0;i<16;i++) niz[i]=niz_unos[i]; // !!!! imao si niz=niz_unos } int main(int argc, char *argv[]){ // !!!! main je po standardu int float Niz_Probni[16]={ 1,2,3,4, 3,7,2,1, 5,6,1,3, 3,2,1,1}; Matrica M(Niz_Probni); // !!!! Matrica je tip, a M instanca (nju koristi nadalje) for(int i=0;i<16;i++) cout<<" "<<M.niz[i]; // !!!! imao si Matrica.niz[1] system("PAUSE"); return 0; } [ idb @ 16.09.2004. 12:06 ] @
Ops neko je bio brzi, sada imas dva prilaza ... ali ti nece skoditi nijedan
[ janjam @ 16.09.2004. 12:35 ] @
Samo jedan mali dodatak kod mog koda, u main-u na kraju dodaj jos jednu liniju:
Code: delete M; *ebi ga, ipak je ovo C++. [ Dragi Tata @ 16.09.2004. 13:02 ] @
Pa zašto je M uopšte bilo na heapu?
Lepo staviš Code: Matrica M(Niz_Probni); for(int i=0;i<16;i++) cout<<" "<<M.niz[i]; i uživaš. Stack je najbolji GC. [ filmil @ 16.09.2004. 14:52 ] @
Citat: Stack je najbolji GC. f [ Dragi Tata @ 16.09.2004. 15:37 ] @
I neogrančienom veličinom heapa.
[ filmil @ 16.09.2004. 16:05 ] @
Citat: I neogrančienom veličinom heapa. [ Mrav @ 16.09.2004. 18:28 ] @
Ako će alocirati mnogo takvih objekata prema potrebi i prema potrebi ih brisati bolje je na heap-u, štedi memoriju.
[ maxmagnus2 @ 17.09.2004. 08:27 ] @
1. Zar ne brises ceo M ako mu odradis deleate, bez dalje opcije prilaza tim podacima?
2. Koja je razlika izmedju ubijanja pomocu destruktora i ovog delete? 3.Stek i Heap? Ako ih dobro razumem onda imam brz pristup necemu na steku koji je fizicki deo procesora\karte, a heap deo na HDD-u odvojen za rad koji je bitno sporiji? [ janjam @ 17.09.2004. 09:11 ] @
1. Naravno. Delete odradis na kraju manipulacije sa instancom sto je gore i navedeno (na kraju main()).
2. Pa prakticno gledano - nema razlike. Svako pozivanje new alocira prostor u memoriji pomocu konstruktora, a svako pozivanje delete dealocira taj prostor pomocu destruktora. Delete ti je ustvari "ubijanje pomocu destruktora". Gledaj na to kao na pozajmljivanje parcenceta memorije od OS-a, i na kraju vracanje istog OS-u. 3. Heap je deo memorije (RAM-a), a ne HDD-a. [ filmil @ 17.09.2004. 10:03 ] @
Citat: 1. Zar ne brises ceo M ako mu odradis deleate, bez dalje opcije prilaza tim podacima? Citat: 2. Koja je razlika izmedju ubijanja pomocu destruktora i ovog delete? Citat: 3.Stek i Heap? Ako ih dobro razumem onda imam brz pristup necemu na steku koji je fizicki deo procesorakarte, a heap deo na HDD-u odvojen f [ filmil @ 17.09.2004. 10:04 ] @
Citat: Gledaj na to kao na pozajmljivanje parcenceta memorije od OS-a, i na kraju vracanje istog OS-u. f [ Mrav @ 17.09.2004. 13:58 ] @
Moraš da vodiš računa o nečemu. Ako alociraš objekte na heap-u ti ih referenciraš preko pokazivača (koji pokazuje na memorijski prostor koji ti je sistem rezervisao za taj objekat i koji je veličine objekta). delete dealocira taj prostor, ako to ne uradiš možeš proizvesti takozvano curenje memorije (prostor je alociran a nemoguće ga je više koristiti), primer za to je objekta a zatim inicijalizacija na nultu vrednost što znači da je pokazivač prazan (ne pokazuje više na dati objekat).
Objekat *n = new Objekat(); n = 0; pokazivač više ne pokazuje na prostor na heapu, a memorija nije prethodno dealocirana. [ ivbrcic @ 04.11.2004. 11:14 ] @
Evo i mog rjesenja nesto fleksibilnijeg:
Code: #include <iostream> // nema vise iostream.h #include <string> template <typename T, int SZ> // da bi omogucili da radimo sa svim buit-in tipovima, bez alokacije class Matrica { T niz[SZ]; public: Matrica(const T *arr); T Get(int indx); }; template <typename T, int SZ> Matrica<T,SZ>::Matrica(const T *arr) { memcpy(niz, arr, sizeof(T)*SZ); } template <typename T, int SZ> T Matrica<T,SZ>::Get(int index) { return niz[index]; } typedef float TIP; #define SIZE(x) (sizeof(x)/sizeof(x[0])) void main() { TIP Niz_Probni[16]={ 1,2,3,4,3,7,2,1,5,6,1,3,3,2,1,1}; Matrica<TIP, SIZE(Niz_Probni)> m(Niz_Probni); std::cout << m.Get(5); } Copyright (C) 2001-2024 by www.elitesecurity.org. All rights reserved.
|