Tablica klas a ich konstruktor

dział ogólny

Tablica klas a ich konstruktor

Nowy postprzez Miroo_007 » niedziela, 14 grudnia 2008, 15:25

Witam
Mam problem przy przydzielaniu początkowych wartości dla tablicy klas w konstruktorze.
Kod: Zaznacz cały
class TKlasa {
public:
int liczba;
TKlasa(void);
};
TKlasa Klasa1[10];
TKlasa::TKlasa(void) {
//???
}

Jak przydzielić zmiennej "liczba" np dla Klasa1[2] jakąś wartość.
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Tablica klas a ich konstruktor

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 15 grudnia 2008, 13:53

Ten Twój kod wygląda nieco dziwacznie, czy nie powinno być przypadkiem tak:

Kod: Zaznacz cały
    class TKlasa {
    public:
    int liczba;
    __fastcall TKlasa(); // <--
    };
//-------------------------------------------------
    TKlasa *Klasa1[10];
    Klasa1[1] = new TKlasa();
    Klasa1[2] = new TKlasa();
    Klasa1[3] = new TKlasa();
   // itd...

W powyższym przykładzie podałeś tylko deklarację klasy, zakładam, że definicję również stworzyłeś, bez tego ani rusz. Jeżeli nie poczytaj sobie w serwisie Cyfrowy Baron dział: teoria -> tworzenie klas.
Co do odwołania się do zmiennej składowej klasy, to zasada jest taka sama jak dla każdej klasy:

Kod: Zaznacz cały
    TKlasa *Klasa1[10];
    Klasa1[1] = new TKlasa();
    Klasa1[2] = new TKlasa();

    Klasa1[2]->liczba = 10;
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Tablica klas a ich konstruktor

Nowy postprzez Miroo_007 » wtorek, 16 grudnia 2008, 11:34

Nie chodzi mi o przydzielanie wartości w taki sposób:
Kod: Zaznacz cały
Klasa1[3] = new TKlasa();

Chodzi mi o przydzielanie początkowych wartości na etapie inicjalizacji, czyli:
Kod: Zaznacz cały
class TKlasa {
    public:
    int liczba;
    TKlasa() {
     //PrzyporzÄ…dkowanie dla zmiennej liczba poczÄ…tkowej wartoÅ›ci
    }
    };
//-------------------------------------------------
    TKlasa Klasa1[10];

Jeżeli wykonałbym coś takiego:
Kod: Zaznacz cały
class TKlasa {
    public:
    int liczba;
    TKlasa() {
     liczba = 10;
    }
    };

To otrzymałbym w każdej tablicy tą samą wartość. Ja chciałbym mieć w każdym elemencie tablicy inna wartość.
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Tablica klas a ich konstruktor

Nowy postprzez Cyfrowy Baron » wtorek, 16 grudnia 2008, 11:52

Rozumiem, chcesz przypisać zmiennej liczba jakąś wartość początkową dla klasy.
To co jednak próbujesz zrobić z tą zmienną i z tą klaś, to BZDURA. Nie można tworzyć tablicy klas.
Klasa nie jest obiektem, jest klasą i może występować tylko w jednej liczbie, a nie jako tablica. Po stworzeniu obiektów w oparciu o tą klasę możesz stworzyć tablicę obiektów, tak jak to przedstawiłem.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Tablica klas a ich konstruktor

Nowy postprzez kinio » wtorek, 16 grudnia 2008, 12:26

Witam!

To otrzymałbym w każdej tablicy tą samą wartość. Ja chciałbym mieć w każdym elemencie tablicy inna wartość.

Co rozumiesz pod pojęciem inną wartość? Czy chodzi Ci o:
- dowolną wartość tylko żeby była inna od pozostałych
- konkretną wartość, którą będziesz chciał ustawić samodzielnie
Podaj proszę więcej szczegółów jakie to mają być wartości i tak naprawdę do czego Ci jest to potrzebne, bo być może jest inny lepszy sposób rozwiązania.

Pozdrawiam!
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Tablica klas a ich konstruktor

Nowy postprzez Miroo_007 » wtorek, 16 grudnia 2008, 14:18

Potrzebuje inicjować konkretną wartość w konstruktorze a usuwać ja w destruktorze. A oto mój fragment kodu:
Kod: Zaznacz cały
//-------unit1.h---------
class TGlowna {
public:
static AnsiString sciezka_do_listy_txt;
TStringList *Lista;
TGlowna(void);
~TGlowna(void);
};
//---------------unit1.cpp-----------------
TGlowna glowna[10];
TGlowna::TGlowna(void) {
sciezka = "C:\\Program Files\\Program01\\Lista.txt";
Lista = new TStringList;
TStringList *Lista_lokalna = new TStringList;
Lista_lokalna->LoadFromFile(sciezka);
for(int i=0;i<Lista_lokalna->Count;i++) {
Lista->LoadFormFile(Lista_lokalna->String[i]);
delete Lista_lokalna;
}
TGlowna::~TGlowna(void) {
delete Lista;
}

Zmienna sciezka zawiera ścieżki do plików tekstowych.
Reasumując. Potrzebuję nadawać konkretną wartość dla tablicy obiektów na etapie inicjalizacji.
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Tablica klas a ich konstruktor

Nowy postprzez kinio » wtorek, 16 grudnia 2008, 14:40

Witam!

Potrzebuje inicjować konkretną wartość w konstruktorze

A czy to jest jakieś wymaganie, czy tak sobie wymyśliłeś że tak ma być?

Tak naprawdę to jest zły zwyczaj umieszczać tego typu instrukcje w konstruktorze. Do tego powinna służyć osobna metoda, która może jako parametr przyjąć np. ścieżkę do Twojego pliku a w samym konstruktorze wywołać ją z konkretnym parametrem - to po pierwsze.
Raczej będzie ciężko coś wymyślić aby przy takiej definicji tablicy:
Kod: Zaznacz cały
TGlowna glowna[10];

nagle obiekty przyjęły odpowiednie wartości pól - bo niby skąd jak nawet ich nigdzie nie podajesz!

Myślę że najlepszym rozwiązaniem było by stworzenie innego konstruktora np. tak:
Kod: Zaznacz cały
TGlowna::TGlowna(AnsiString __path) {
sciezka = __path;
Lista = new TStringList;
TStringList *Lista_lokalna = new TStringList;
Lista_lokalna->LoadFromFile(sciezka);
for(int i=0;i<Lista_lokalna->Count;i++) {
Lista->LoadFormFile(Lista_lokalna->String[i]);
delete Lista_lokalna;
}

a następnie przy definicji tablicy:
Kod: Zaznacz cały
TGlowna glowna[] = {TGlowna("plik1.txt"), TGlowna("plik2.txt"), TGlowna("c:\\plik3.txt"), TGlowna("..\\plik.txt")};


Jeżeli ta odpowiedź Cię nie satysfakcjonuje to będziesz musiał podać jeszcze więcej szczegółów swojego programu.

A tak na przyszłość to musisz nauczyć się pisać tak programy aby były przede wszystkim:
- Å‚atwo modyfikowanle
- Å‚atwo roszerzalne
- czytelne

Pozdrawiam!
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Tablica klas a ich konstruktor

Nowy postprzez Miroo_007 » wtorek, 16 grudnia 2008, 18:24

Wpadłem na pewien pomysł. Może wykorzystać do inicjalizacji tablicy obiektów przeładowanie operatorów [ ]. Czyli:
Kod: Zaznacz cały
TKlasa Klasa1[10];

Tylko nigdy czegoś takiego jeszcze nie robiłem. Może ktoś podsunie mały przykład przeładowania tych operatorów. No i pozostaje pytanie jak usuwać obiekty stworzone za pomocą instrukcji new.
Co do pomysłu Kinia:
Kod: Zaznacz cały
TGlowna glowna[] = {TGlowna("plik1.txt"), TGlowna("plik2.txt"), TGlowna("c:\\plik3.txt"), TGlowna("..\\plik.txt")};

Pomysł jest dobry ale po pierwsze - nie można takiej listy modyfikować podczas pracy programu, a po drugie - jeżeli chciałbym zwiększyć tablicę np. do 100 to ten zapis mijałby się z celem.
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Tablica klas a ich konstruktor

Nowy postprzez Miroo_007 » wtorek, 16 grudnia 2008, 18:37

A czy to jest jakieś wymaganie, czy tak sobie wymyśliłeś że tak ma być?

Tak to wymyśliłem. Oto przykład dlaczego:
Kod: Zaznacz cały
TGlowna glowna[10];
//-------------------
void Jakas_funkcja(void) {
TGlowna glowna[5];
//Pozostale instrukcje
}

Tworząc tablice obiektów klasy TGlowna w funkcji Jakas_funkcja() mam już gotowe dane, na jakich mogę pracować. Nie muszę wykonywać dodatkowych czynności. Taki zapis staje się bardzo pomocny.
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Tablica klas a ich konstruktor

Nowy postprzez Cyfrowy Baron » wtorek, 16 grudnia 2008, 19:31

Dla mnie to wszystko wygląda jakoś niedorzecznie. Chcesz się odwoływać wewnątrz funkcji klasy do tejże klasy, gdy klasa nie jest obiektem!
Co do tego przeładowania (przeciążenia) operatorów, to wogóle tego nie rozumiem. W Twoim przypadku nie ma operatorów, tylko wartości określające rozmiar tablicy. Przeładowanie operatorów to rodzaj polimorfizmu, więc na tym powinieneś się skupić, jednak w Twoim przypadku nie mamy do czynienia z operatorami.

TGlowna("plik1.txt") - to jest rzutowanie typu AnsiString na klasÄ™ TGlowna.

TGlowna glowna[] = {TGlowna("plik1.txt"), TGlowna("plik2.txt"), TGlowna("c:\\plik3.txt"), TGlowna("..\\plik.txt")};

Taka tablica musi mieć określony z góry rozmiar.

Zastanawiam się po co te wszystkie kombinację.Zadanie na pewno da się zrealizować w jakiś łatwiejszy sposób.

Opisałeś tot ak, że nie rozumiem o co chodzi...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Tablica klas a ich konstruktor

Nowy postprzez kinio » wtorek, 16 grudnia 2008, 20:03

Witam!

Widzę że nie na darmo masz rangę bladawiec i przydało by Ci się kilka lekcji z C++ :)

Tak to wymyśliłem. Oto przykład dlaczego:
Kod: Zaznacz cały
TGlowna glowna[10];
//-------------------
void Jakas_funkcja(void) {
TGlowna glowna[5];
//Pozostale instrukcje
}

Tworząc tablice obiektów klasy TGlowna w funkcji Jakas_funkcja() mam już gotowe dane, na jakich mogę pracować. Nie muszę wykonywać dodatkowych czynności. Taki zapis staje się bardzo pomocny.

Tak oczywiście taki zapis byłby bardzo pomocny tylko niby skąd ten biedny kompilator ma wiedzieć jakie ścieżki chcesz mu tam podać ??!! Musisz to w jakiś sposób zrobić, tutaj lub w innym miejscu programu!!
Odpisujesz strasznie lakonicznie bez żadnej większej ilości szczegółów - nie bój się na pewno nikt nie zechce rościć sobie praw do Twojego kodu źródłowego :)
Tak naprawdę nie wiadomo o co do końca Ci chodzi!! Nie dajesz sobie pomóc mimo naszych szczerych chęci, więc nie pomogę radź sobie sam, zresztą uważam że to i tak najlepsza forma nauki!!
Wpadłem na pewien pomysł. Może wykorzystać do inicjalizacji tablicy obiektów przeładowanie operatorów [ ](...)Tylko nigdy czegoś takiego jeszcze nie robiłem

Właśnie widzę i na razie nie zabieraj się za to!!
Będziesz musiał jeszcze o tym poczytać, ale od razu Ci powiem że taki zapis jakiego Ty chcesz użyć nie będzie możliwy nawet przy przeładowaniu Twojego operatora!!
No i pozostaje pytanie jak usuwać obiekty stworzone za pomocą instrukcji new.

Operatorem delete. Jeżeli takiego nie znasz to nie dobrze.

Kod: Zaznacz cały
Pomysł jest dobry ale po pierwsze - nie można takiej listy modyfikować podczas pracy programu, a po drugie - jeżeli chciałbym zwiększyć tablicę np. do 100 to ten zapis mijałby się z celem.

A słyszałeś o czymś takim jak klasy pojemnikowe - wektor, lista, talia, drzewo, mapa? Jak nie to poczytaj może będą w stanie Ci pomóc.
Cyfrowy Baron napisał(a):Co do tego przeładowania (przeciążenia) operatorów, to wogóle tego nie rozumiem. W Twoim przypadku nie ma operatorów, tylko wartości określające rozmiar tablicy.

Zgadzam siÄ™!
Cyfrowy Baron napisał(a):TGlowna("plik1.txt") - to jest rzutowanie typu AnsiString na klasę TGlowna.

Nieprawda rzutowanie wyglądało by tak:
Kod: Zaznacz cały
TGlowna obiekt = (TGlowna)"plik1.txt"

i wymagało by takiej definicji w klasie AnsiString:
Kod: Zaznacz cały
AnsiString::operator TGlowna(void);

Natomiast powyższy zapis jest tylko stworzeniem tymczasowego obiektu klasy TGlowna za pomocą konstruktora TGlowna(AnsiString).
Kod: Zaznacz cały
TGlowna glowna[] = {TGlowna("plik1.txt"), TGlowna("plik2.txt"), TGlowna("c:\\plik3.txt"), TGlowna("..\\plik.txt")};

W powyższym zapisie, każdy obiekt tymczasowy jest później kopiowany do nowej instancji obiektu klasy TGlowna w tablicy glowna.
Cyfrowy Baron napisał(a):Zastanawiam się po co te wszystkie kombinację.Zadanie na pewno da się zrealizować w jakiś łatwiejszy sposób.

Tego też jestem pewien!

Pozrawiam!
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Tablica klas a ich konstruktor

Nowy postprzez Cyfrowy Baron » wtorek, 16 grudnia 2008, 20:54

Nieprawda rzutowanie wyglądało by tak:


Fakt, nie spojrzałem na te nawiasy i sugerowałem się tym kodem:

TGlowna glowna[] = {TGlowna("plik1.txt"), TGlowna("plik2.txt"), TGlowna("c:\\plik3.txt"), TGlowna("..\\plik.txt")};

mylnie sądziłem, że Miro_007 chce wykorzystać polimorfizm do stworzenia tablicy typu TGlowna, czyli przyjąłem założenie w stylu:

AnsiString tablica[] = {(5ring)1, (5ring)2, (5ring)3, (5ring)4};

Wynika to z faktu iż usilnie próbuję zrozumieć, do czego dąży autor tej porady, ale gubię się w tym...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Tablica klas a ich konstruktor

Nowy postprzez kinio » wtorek, 16 grudnia 2008, 20:59

Cyfrowy Baron napisał(a):Wynika to z faktu iż usilnie próbuję zrozumieć, do czego dąży autor tej porady, ale gubię się w tym...

Ja też nie mam pojęcia o co konkretnie chodzi :cry:
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Tablica klas a ich konstruktor

Nowy postprzez Miroo_007 » wtorek, 16 grudnia 2008, 22:13

OK. Wykonam to w bardziej prostszy sposób. Chodziło mi o to że tworząc pojedyncze obiekty mojej klasy, mogę nadawać początkowe wartości w konstruktorze. Ale już nie mogę tego robić jak tworzę tablicę obiektów tej klasy.
Jeżeli chodzi o mój "profesjonalizm" to jestem tylko hobbystą i nie studiowałem w tym kierunku:(
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Tablica klas a ich konstruktor

Nowy postprzez Witold » Å›roda, 17 grudnia 2008, 11:01

UczÄ…c siÄ™, sprawdzam sobie nawet to co piszÄ… ludzie znajÄ…cy lepiej c++ i widzÄ™ kilka drobnostek:

kinio napisał(a):Nieprawda rzutowanie wyglądało by tak:
Kod: Zaznacz cały
TGlowna obiekt = (TGlowna)"plik1.txt"

i wymagało by takiej definicji w klasie AnsiString:
Kod: Zaznacz cały
AnsiString::operator TGlowna(void);


Kinio dodałeś kostruktor TGlowna::TGlowna(AnsiString __path) i do rzutowania nie trzeba operatora dla AnsiString’a. (gdyby był byłaby chyba niejednoznaczność). "plik1.txt" nie jest typu AnsiString . A TGlowna("plik1.txt") też chyba można traktować jako rzutowanie (styl c funkcyjny tak jak int i = int(7.2))

kinio napisał(a):[/code]
Natomiast powyższy zapis jest tylko stworzeniem tymczasowego obiektu klasy TGlowna za pomocą konstruktora TGlowna(AnsiString).
Kod: Zaznacz cały
TGlowna glowna[] = {TGlowna("plik1.txt"), TGlowna("plik2.txt"), TGlowna("c:\\plik3.txt"), TGlowna("..\\plik.txt")};

W powyższym zapisie, każdy obiekt tymczasowy jest później kopiowany do nowej instancji obiektu klasy TGlowna w tablicy glowna.

Sprawdziłem - brak wywołań konstruktora kopiującego, wiec chyba niema obiektów tymczasowych.

Cyfrowy Baron napisał(a):
Fakt, nie spojrzałem na te nawiasy i sugerowałem się tym kodem:

TGlowna glowna[] = {TGlowna("plik1.txt"), TGlowna("plik2.txt"), TGlowna("c:\\plik3.txt"), TGlowna("..\\plik.txt")};

mylnie sądziłem, że Miro_007 chce wykorzystać polimorfizm do stworzenia tablicy typu TGlowna, czyli przyjąłem założenie w stylu:

AnsiString tablica[] = {(5ring)1, (5ring)2, (5ring)3, (5ring)4};


Gdzie tu jest polimorfizm ?
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 8 gości

cron