🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

6 total messages Started by Piotr Gałka Fri, 28 Jul 2023 12:58
Inicjowanie tablicy klas
#310471
Author: Piotr Gałka
Date: Fri, 28 Jul 2023 12:58
39 lines
2212 bytes
Jak jest klasa bez domyślnego konstruktora:

class Ala
{
   int A;
public:
   Ala(int a):A(a){}
};

to tablicę takich klas mogę zainicjować:

Ala Tab[2]={Ala(1),Ala(2)};

Ale nie wiem jak zainicjować taką tablicę w konstruktorze kolejnej 
klasy. Chodziło by o coś w stylu:

class Tablica
{
   Ala T[2];
public:
   Tablica():T({Ala(1),Ala(2)}){}	// --- to nie przechodzi
};

Próbowałem trochę poszukać w necie ale na hasło o inicjalizacji tablic 
klas znajduję tylko przykłady jak moje Tab[], które działa.

Potrzebuję użyć klasy Ala w kilku różnych klasach, ale tylko w jednej 
będzie tabela. Czyli mogę dołożyć default konstruktor z danymi jak do 
tej jednej klasy i dopóki nie będę potrzebował drugiej klasy z tabelką 
to 'temat załatwiony'.

Ale, choć zapewne nigdy mi to nie będzie potrzebne (nie jestem 
programistą) to z czystej ciekawości chciałbym wiedzieć jak zainicjować 
tabelę elementów klasy nie posiadającej default konstruktora w 
konstruktorze klasy zawierającej tę tabelę.

Widziałem jakieś info, które może sugerować, że w C++ 11 coś w tej 
kwestii mogło się zmienić. Mój kompilator jest starszy.
P.G.
Re: Inicjowanie tablicy klas
#310472
Author: Piotr Gałka
Date: Fri, 28 Jul 2023 13:16
50 lines
3026 bytes
W dniu 2023-07-28 o 14:58, Piotr Gałka pisze:
> Jak jest klasa bez domyślnego konstruktora:
> 
> class Ala
> {
>    int A;
> public:
>    Ala(int a):A(a){}
> };
> 
> to tablicę takich klas mogę zainicjować:
> 
> Ala Tab[2]={Ala(1),Ala(2)};
> 
> Ale nie wiem jak zainicjować taką tablicę w konstruktorze kolejnej 
> klasy. Chodziło by o coś w stylu:
> 
> class Tablica
> {
>    Ala T[2];
> public:
>    Tablica():T({Ala(1),Ala(2)}){}    // --- to nie przechodzi
> };
> 
> Próbowałem trochę poszukać w necie ale na hasło o inicjalizacji tablic 
> klas znajduję tylko przykłady jak moje Tab[], które działa.
> 
> Potrzebuję użyć klasy Ala w kilku różnych klasach, ale tylko w jednej 
> będzie tabela. Czyli mogę dołożyć default konstruktor z danymi jak do 
> tej jednej klasy i dopóki nie będę potrzebował drugiej klasy z tabelką 
> to 'temat załatwiony'.
> 
> Ale, choć zapewne nigdy mi to nie będzie potrzebne (nie jestem 
> programistą) to z czystej ciekawości chciałbym wiedzieć jak zainicjować 
> tabelę elementów klasy nie posiadającej default konstruktora w 
> konstruktorze klasy zawierającej tę tabelę.
> 
> Widziałem jakieś info, które może sugerować, że w C++ 11 coś w tej 
> kwestii mogło się zmienić. Mój kompilator jest starszy.

Bez zająknięcia prześliznąłem się nad tym, że to co napisałem o 
dołożeniu default konstruktora jest możliwe bo wszystkie obiekty w 
tabelce chcę tak samo inicjować (ale inaczej niż w innych klasach). 
Czyli, jeśli nie za bardzo by mi pasowało dodawanie z tego powodu 
defaultowego konstruktora (że gdzieś, kiedyś mogę zapomnieć i się 
zainicjuje zamiast zasygnalizować, że zapomniałem) to nie powinienem 
mieć nic przeciwko zrobieniu defaultowo konstruowanej pochodnej klasy 
Ala po to tylko aby ją użyć do tej tabelki.

P.G.
Re: Inicjowanie tablicy klas
#310473
Author: JDX
Date: Sat, 29 Jul 2023 08:59
17 lines
1820 bytes
On 28.07.2023 14:58, Piotr Gałka wrote:
[...]
> Ale nie wiem jak zainicjować taką tablicę w konstruktorze kolejnej 
> klasy. Chodziło by o coś w stylu:
> 
> class Tablica
> {
>    Ala T[2];
> public:
>    Tablica():T({Ala(1),Ala(2)}){}    // --- to nie przechodzi
> };
Odpowiedź masz np. tutaj: 
https://stackoverflow.com/questions/11837078/initialize-a-constant-sized-array-in-an-initializer-list, 
hint: nawiasy klamrowe zamiast zwykłych. W każdym razie tak czy siak 
musisz wywalić ten zabytkowy kompilator, którego używasz tam, gdzie jego 
miejsce, czyli na śmietnik. Na pewno znajdzie się coś bardziej 
współczesnego. W końcu standard C++ 11 jest już na rynku od dosyć dawna.
Re: Inicjowanie tablicy klas
#310474
Author: Piotr Gałka
Date: Tue, 01 Aug 2023 13:39
63 lines
3980 bytes
W dniu 2023-07-29 o 10:59, JDX pisze:
> On 28.07.2023 14:58, Piotr Gałka wrote:
> [...]
>> Ale nie wiem jak zainicjować taką tablicę w konstruktorze kolejnej 
>> klasy. Chodziło by o coś w stylu:
>>
>> class Tablica
>> {
>>    Ala T[2];
>> public:
>>    Tablica():T({Ala(1),Ala(2)}){}    // --- to nie przechodzi
>> };

> Odpowiedź masz np. tutaj: 
> https://stackoverflow.com/questions/11837078/initialize-a-constant-sized-array-in-an-initializer-list, hint: nawiasy klamrowe zamiast zwykłych.

Tablica int to jednak coś nieco innego niż tablica klas. Da się 
inicjować bezpośrednio liczbami, a tu trzeba jakoś zamienić te liczby na 
obiekty klasy.

Żaden z wariantów:
Tablica():T({Ala(1),Ala(2)}){}  // to był mój oryginalny strzał
Tablica():T{{Ala(1),Ala(2)}}{}
Tablica():T({Ala{1},Ala{2}}){}
Tablica():T{{Ala{1},Ala{2}}){}
nie przechodzi.

> W każdym razie tak czy siak musisz wywalić ten zabytkowy kompilator, którego używasz tam, gdzie jego miejsce, czyli na śmietnik. Na pewno znajdzie się coś bardziej współczesnego. W końcu standard C++ 11 jest już na rynku od dosyć dawna.


Większość programów (niektóre względnie często modyfikuję) mam napisane 
pod Builderem 5.
Kilka mam pod Builderem 2010.

Te próby z tą klasą robię pod Builderem 2010.
Właśnie zrezygnowałem z wkładania do klasy Ala referencji do innej klasy 
bo wtedy default konstruktor nie miałby jak jej zainicjować - będę 
podawał referencje jako parametr niektórych funkcji klasy Ala.

Nie przerzuciłem się ze wszystkim na Buildera 2010 bo się okazało, że 
pod Win7 on pozwalał się tylko raz uruchomić, a ja mam odruch zamykania 
programów gdy uruchamiam inne i musiałbym co chwilę komputer resetować.

Od roku mam Win10 pod którym Builder 2010 daje się uruchamiać wiele razy.
Zainstalowałem go, zarejestrowałem i sprawdziłem, że działa i odłączyłem 
się od sieci.
Minęło z pół roku i chciałem go użyć, a on, że coś się nie zgadza i 
muszę się ponownie zarejestrować.
Wyczyściłem komputer ze wszystkiego co ważne i połączyłem się do sieci 
aby znów się zarejestrować. Zaraz się odłączyłem. Od tamtej pory na 
razie kompilator działa :)

Nie znam innych kompilatorów. Podobno musiałbym od nowa się uczyć jak 
sobie budować interface użytkownika - nie mam na to czasu.
Dla moich sporadycznych potrzeb szkoda wywalać kasę na nowszą wersję.
Ja piszę tylko programiki do rozwiązania jakichś naszych potrzeb 
wewnętrznych - produkcja, testowanie, konfiguracja, wrzucenie upgrade'u 
do urządzenia.

Właśnie wróciłem do programu napisanego w 2014 aby się zorientować, że 
jakiś idiota (czyli ja) pisał komentarze tak, że wydawało mu się, że 
wyjaśniają o co biega.
P.G.
Re: Inicjowanie tablicy klas
#310475
Author: JDX
Date: Tue, 01 Aug 2023 19:06
31 lines
2890 bytes
On 01.08.2023 15:39, Piotr Gałka wrote:
[...]
> Żaden z wariantów:
> Tablica():T({Ala(1),Ala(2)}){}  // to był mój oryginalny strzał
> Tablica():T{{Ala(1),Ala(2)}}{}
> Tablica():T({Ala{1},Ala{2}}){}
> Tablica():T{{Ala{1},Ala{2}}){}
> nie przechodzi.
Ten wariant przejdzie (we w miarę współczesnym kompilatorze):
Tablica():T{Ala(1),Ala(2)}{}

> Nie znam innych kompilatorów. Podobno musiałbym od nowa się uczyć jak 
> sobie budować interface użytkownika - nie mam na to czasu.
> Dla moich sporadycznych potrzeb szkoda wywalać kasę na nowszą wersję.
> Ja piszę tylko programiki do rozwiązania jakichś naszych potrzeb 
> wewnętrznych - produkcja, testowanie, konfiguracja, wrzucenie upgrade'u 
> do urządzenia.Przede wszystkim Builder to nie jest kompilator tylko IDE, w skład 
którego wchodzi m.in. kompilator. Jeśli chodzi o (gołe) kompilatory pod 
Windows to masz bardzo dobre, współczesne i na dodatek bezpłatne gcc (w 
połączeniu z MSYS2) oraz clang. Jako coś w stylu IDE można użyć np. 
Eclipse CDT czy ostatnio bardzo popularnego i również bezpłatnego Visual 
Studio Code (ale nie są to jedyne opcje). W wersji trochę bardziej 
hardkorowej można używać Nptepad++ i zwykłego make bądź, nawet lepiej, 
CMake. A do programowania/budowania GUI masz np. QTCreatora (Qt jako 
biblioteka do GUI) czy wxFormBuildera (wxWidgets jako biblioteka do 
GUI). W każdym razie jest z czego wybierać i będą to rozwiązania nie 
gorsze od typowych IDE jak Builder czy Visual Studio.

BTW. A w bonusie masz łatwą możliwość przeniesienia oprogramowania na 
Linuksa czy Maca, w tym przeniesienia GUI, jeśli do GUI używasz 
wxWidgets bądź Qt.
Re: Inicjowanie tablicy klas
#310476
Author: Piotr Gałka
Date: Wed, 02 Aug 2023 19:06
22 lines
2024 bytes
W dniu 2023-08-01 o 21:06, JDX pisze:
> On 01.08.2023 15:39, Piotr Gałka wrote:
> [...]
>> Żaden z wariantów:
>> Tablica():T({Ala(1),Ala(2)}){}  // to był mój oryginalny strzał
>> Tablica():T{{Ala(1),Ala(2)}}{}
>> Tablica():T({Ala{1},Ala{2}}){}
>> Tablica():T{{Ala{1},Ala{2}}){}
>> nie przechodzi.

> Ten wariant przejdzie (we w miarę współczesnym kompilatorze):
> Tablica():T{Ala(1),Ala(2)}{}

Czyli tak jak mi się wydawało, że to powinno być zapisane.

> W każdym razie jest z czego wybierać

Dzięki za informacje. Zanotuję sobie wszystkie nazwy jakie podałeś.
Posiadanie nowego kompilatora nie jest dla mnie krytyczne.
Skoro dotychczas nie miałem potrzeby skorzystania z nowych konstrukcji 
C++11 to znaczy, że dalej sobie bez nich też jakoś poradzę.
P.G.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads