[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

pl.comp.programming

inicjalizacja tablic tworzonych za pomoca konstruktora, C++

Deltak

12/5/2006 3:40:00 PM

Mamy klase:

class tmp_node {
private:
int *T;
char **tab_name;
public:
tmp_node( int tmp_st_num);
};

Konstuktor:
tmp_node::tmp_node( int tmp_st_num)
{
for ( int i=0; i< trans_num; i++) { //trans num jest dostepny z
innej klasy
T= new int[ tmp_st_num];
tab_name= new char[ tmp_st_num];
}
};

W ciele funkcji skladowej innej klasy chce stworzyc tablice wezlow:

tab_tmp_node= new tmp_node[trans_num];

Jskk przekazaa parametr tmp_st_num, skoro nie wolno tylko uzyc
konstruktora domniemanego przy twozeniu tablicy operatorem new.
Czy jest na to rozwiazanie inne ni? stworzenie funkcji inicjalizujacej.
Czy w ogole funkcja inicjalizujaca bedzie dzialaa?
po co w takim razie kontruktor skoro i tak musze uzywac funkji
inicjalizujacej?

Deltak
5 Answers

chips

12/5/2006 4:12:00 PM

0


Deltak napisal(a):
> Mamy klase:
>
> class tmp_node {
> private:
> int *T;
> char **tab_name;
> public:
> tmp_node( int tmp_st_num);
> };
>
> Konstuktor:
> tmp_node::tmp_node( int tmp_st_num)
> {
> for ( int i=0; i< trans_num; i++) { //trans num jest dostepny z
> innej klasy
> T= new int[ tmp_st_num];
> tab_name= new char[ tmp_st_num];
> }
> };
>
> W ciele funkcji skladowej innej klasy chce stworzyc tablice wezlow:
>
> tab_tmp_node= new tmp_node[trans_num];
>
> Jskk przekazaæ parametr tmp_st_num, skoro nie wolno tylko uzyc
> konstruktora domniemanego przy twozeniu tablicy operatorem new.
> Czy jest na to rozwiazanie inne ni¿ stworzenie funkcji inicjalizujacej.
> Czy w ogole funkcja inicjalizujaca bedzie dzialaæ?
> po co w takim razie kontruktor skoro i tak musze uzywac funkji
> inicjalizujacej?
>
> Deltak

To nie jest odpowiedz na Twoje pytanie, ale przyjrzyj sie
konstruktorowi - tworzysz tablice T i tab_name bez zwalniania PRZY
KAZDYM przebiegu petli! Powazny wyciek pamieci, no i czy na pewno
program Ci sie nie wyklada? :>

Deltak

12/5/2006 4:21:00 PM

0

chips wrote:

> Deltak napisaÅ?(a):
>
>>Mamy klase:
>>
>>class tmp_node {
>>private:
>> int *T;
>> char **tab_name;
>>public:
>> tmp_node( int tmp_st_num);
>>};
>>
>>Konstuktor:
>>tmp_node::tmp_node( int tmp_st_num)
>>{
>> for ( int i=0; i< trans_num; i++) { //trans num jest dostepny z
>>innej klasy
>> T= new int[ tmp_st_num];
>> tab_name= new char[ tmp_st_num];
>> }
>>};
>>
>>W ciele funkcji skladowej innej klasy chce stworzyc tablice wezlow:
>>
>>tab_tmp_node= new tmp_node[trans_num];
>>
>>Jskk przekazaæ parametr tmp_st_num, skoro nie wolno tylko uzyc
>>konstruktora domniemanego przy twozeniu tablicy operatorem new.
>>Czy jest na to rozwiazanie inne ni¿ stworzenie funkcji inicjalizujacej.
>>Czy w ogole funkcja inicjalizujaca bedzie dzialaæ?
>>po co w takim razie kontruktor skoro i tak musze uzywac funkji
>>inicjalizujacej?
>>
>>Deltak
>
>
> To nie jest odpowiedź na Twoje pytanie, ale przyjrzyj siÄ?
> konstruktorowi - tworzysz tablice T i tab_name bez zwalniania PRZY
> KAÅ»DYM przebiegu pÄ?tli! Poważny wyciek pamiÄ?ci, no i czy na pewno
> program Ci siÄ? nie wykÅ?ada? :>
>

Ale na tym etapie nie moge jeszcze zwolnic pamieci. Chce stworzyc
dynamicznie tablice obiektow: tmp_node, a do tego jeszcze w kazdym
obiekcie chce dynamicznie tworzyc tablice elementow podstawowych typow.
Nie wydaje mi sie to tak strasznie dziwne. nie chce na sztywno okreslac
rodzmiaru tablic T[] i char *tab_name[].

Deltak

Deltak

12/5/2006 11:15:00 PM

0

chips wrote:
> Deltak napisaÅ?(a):
>
>>Mamy klase:
>>
>>class tmp_node {
>>private:
>> int *T;
>> char **tab_name;
>>public:
>> tmp_node( int tmp_st_num);
>>};
>>
>>Konstuktor:
>>tmp_node::tmp_node( int tmp_st_num)
>>{
>> for ( int i=0; i< trans_num; i++) { //trans num jest dostepny z
>>innej klasy
>> T= new int[ tmp_st_num];
>> tab_name= new char[ tmp_st_num];
>> }
>>};
>>
>>W ciele funkcji skladowej innej klasy chce stworzyc tablice wezlow:
>>
>>tab_tmp_node= new tmp_node[trans_num];
>>
>>Jskk przekazaæ parametr tmp_st_num, skoro nie wolno tylko uzyc
>>konstruktora domniemanego przy twozeniu tablicy operatorem new.
>>Czy jest na to rozwiazanie inne ni¿ stworzenie funkcji inicjalizujacej.
>>Czy w ogole funkcja inicjalizujaca bedzie dzialaæ?
>>po co w takim razie kontruktor skoro i tak musze uzywac funkji
>>inicjalizujacej?
>>
>>Deltak
>
>
> To nie jest odpowiedź na Twoje pytanie, ale przyjrzyj siÄ?
> konstruktorowi - tworzysz tablice T i tab_name bez zwalniania PRZY
> KAÅ»DYM przebiegu pÄ?tli! Poważny wyciek pamiÄ?ci, no i czy na pewno
> program Ci siÄ? nie wykÅ?ada? :>
>

Dzieki za zwrocenie uwagi i przepraszam za roztargninie. Rzeczywiscie
troche sie zapedzilem w tej petli.

Prawidlowo ma byÄ?:
Konstuktor:
tmp_node::tmp_node( int tmp_st_num)
{
T= new int[ tmp_st_num];
tab_name= new char[ tmp_st_num];
};

Ale nadal chcialbym zeby wielkosc tablic dla kazdego tymczasowego wezla
tmp_node byla ustalana dynamicznie.

Deltak

devphyl

12/6/2006 12:51:00 PM

0

tab_name= new char[ tmp_st_num];

chcesz zeby dla kazdego obiektu jego nazwa byla dlugosci tej samej co
ilosc=dlugosc Twojego "int *T"
to powinno byc w deklaracji raczej : char *tab_name; zamiast char
**tab_name.


a jesli chodzi o to by w kazdym obiekcie mogla byc rozna ilosc
elementow
mozesz dorobic kontruktor
tmp_node::tmp_node(){
T = NULL;
tab_name=NULL;
}
zeby cos takiego jak tmp_node tablica[100]; zadzialalo
a potem w petli dla kazdego tablica[i] zmienisz wielkosci
poszczegolnych elementow.

chyba ze zamierzasz uzywac deklaracji tmp_node * tablica;
// wydaje mi sie ze to dodanie /*niepotrzebnego*/ kolejnego poziomu
wskaznikow

spojrz na ten kod:

#include <iostream>
using namespace std;

class tmp_node {
private:
int *T;
char *tab_name;
public:
int ile_jest;
tmp_node( int tmp_st_num);
tmp_node();
};

tmp_node::tmp_node( int tmp_st_num)
{
T= new int[ tmp_st_num];
tab_name= new char[ tmp_st_num];
ile_jest = tmp_st_num;
};

tmp_node::tmp_node(){
T= NULL;
tab_name= NULL;;
ile_jest = 0;
};


int main(){
tmp_node tab[30];
for(int i=1; i<31; i++){
tab[i-1]= tmp_node(i);
}
for(int i=0; i<30; i++){
cout << tab[i].ile_jest << endl;
}

return 0;
}

Deltak

12/6/2006 3:07:00 PM

0

devphylosoff wrote:
> tab_name= new char[ tmp_st_num];
>
> chcesz zeby dla kazdego obiektu jego nazwa byla dlugosci tej samej co
> ilosc=dlugosc Twojego "int *T"
> to powinno byc w deklaracji raczej : char *tab_name; zamiast char
> **tab_name.

Nie. Chce aby ilosc nazw (tablica przechowujaca wskazniki do stringow)
byla równa dlugosci mojego "int *T"
>
> a jesli chodzi o to by w kazdym obiekcie mogla byc rozna ilosc
> elementow
> mozesz dorobic kontruktor
> tmp_node::tmp_node(){
> T = NULL;
> tab_name=NULL;
> }
> zeby cos takiego jak tmp_node tablica[100]; zadzialalo
> a potem w petli dla kazdego tablica[i] zmienisz wielkosci
> poszczegolnych elementow.
>
> chyba ze zamierzasz uzywac deklaracji tmp_node * tablica;
> // wydaje mi sie ze to dodanie /*niepotrzebnego*/ kolejnego poziomu
> wskaznikow

Tak zamierzam uzywac, poniewaz ilosc wezlow zmienia sie dynamicznie.
Dlatego w kodzie wywolujacym musze miec:

int main
{
...
tmp_node *tab_tmp_node;
tab_tmp_node= new tmp_node[trans_num];
...
}

Ale mam nadzieje ze problemu nie bedzie. Dzieki za podsuniecie pomyslu.

Deltak