🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

6 total messages Started by =?UTF-8?Q?Piotr_ Fri, 28 Jul 2023 14:58
Inicjowanie tablicy klas
#291802
Author: =?UTF-8?Q?Piotr_
Date: Fri, 28 Jul 2023 14:58
38 lines
1177 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
#291803
Author: =?UTF-8?Q?Piotr_
Date: Fri, 28 Jul 2023 15:16
49 lines
1863 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
#291804
Author: JDX
Date: Sat, 29 Jul 2023 10:59
16 lines
705 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
#291805
Author: =?UTF-8?Q?Piotr_
Date: Tue, 01 Aug 2023 15:39
62 lines
2777 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
#291806
Author: JDX
Date: Tue, 01 Aug 2023 21:06
31 lines
1686 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
#291807
Author: =?UTF-8?Q?Piotr_
Date: Wed, 02 Aug 2023 21:06
21 lines
784 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