Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Inicjowanie tablicy klas

20 views
Skip to first unread message

Piotr Gałka

unread,
Jul 28, 2023, 8:58:18 AM7/28/23
to
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.

Piotr Gałka

unread,
Jul 28, 2023, 9:16:16 AM7/28/23
to
W dniu 2023-07-28 o 14:58, Piotr Gałka pisze:
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.

JDX

unread,
Jul 29, 2023, 5:00:01 AM7/29/23
to
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.

Piotr Gałka

unread,
Aug 1, 2023, 9:39:51 AM8/1/23
to
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.

JDX

unread,
Aug 1, 2023, 3:06:29 PM8/1/23
to
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.

Piotr Gałka

unread,
Aug 2, 2023, 3:06:52 PM8/2/23
to
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.
0 new messages