Globalna stala tablica

Globalna stala tablica
0

Witam.
Mam taki drobny problem z stworzeniem globalnej stałej tablicy. Jako że ma być stała to nie mogę jej wypełnić wewnątrz funkcji niestety jednak :

Kopiuj
 
class Klasa
{
	private: const int i[] = {1,2};
};

nie działa. Jak i czy w ogóle to można zrobić? Z góry dzięki za wszystkie podpowiedzi.

NO
  • Rejestracja:około 13 lat
  • Ostatnio:około 13 lat
  • Postów:4
0

Słowo kluczowe: static.


Mój blog ;)</a>
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Możesz to wepchnąć do listy inicjalizacyjnej konstruktora, ale mój kompilator mówi że to wymaga do tego dodatkowych parametrów kompilatora.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
0
nobodycodes napisał(a)

Słowo kluczowe: static.

Niestety ten sam bład.

Shalom napisał(a)

Możesz to wepchnąć do listy inicjalizacyjnej konstruktora, ale mój kompilator mówi że to wymaga do tego dodatkowych parametrów kompilatora.

Zapomniałem dodać że jestem raczej początkujący więc nie bardzo rozumiem, ale zmiana parametrów kompilatora niestety odpada.

byku_guzio
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 7 lat
0
Kopiuj
class Foo
{
private:
    static const int tab[];
};

const int Foo::tab[] = {1, 2};

ZJ
  • Rejestracja:około 14 lat
  • Ostatnio:około 12 lat
0

O ile dobrze pamiętam to w ciele klasy możesz tylko definiować stałe całkowitoliczbowe, nie tablice. W klasie musi być np static const int a[], a w jednej jednostce kompilacji (praktycznie w jednym i tylko w jednym pliku c++) const int nazwa_klasy::tab[5]={1,2,3,4,5}.

Edit: czyli dokładnie to, co napisał byku.

edytowany 1x, ostatnio: Zjarek
Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:ponad rok
0

Ale po co ta klasa? To nie jest globalna stała tylko statyczna stała składowa klasy Foo. Globalna stała to:

Kopiuj
const int tab[] = {1, 2};

w zakresie globalnym.


"(...) otherwise, the behavior is undefined".
ZJ
Przy tablicy to i tak chyba trzeba użyć extern w pliku nagłówkowym. Tak dopowiedziałem, bo autor nie podaje błędów kompilatora, to niech ma ich mniej.
Endrju
Const w C++ mają domyślnie linkowanie wewnętrzne lub żadne, a nie zewnętrzne jak w C. Jeżeli ta stała nie byłaby umieszczona w pliku nagłówkowym, to wtedy musiałaby mieć extern.
ZJ
Sprawdziłem, rzeczywiście. Czyli duże tablice są duplikowane w każdym pliku .o używającym danego pliku nagłówkowego?
Endrju
Wtedy chyba tak. Potem zapewne linker to naprawia. (Sprawdziłem: nie naprawia, są dwie kopie w zlinkowanym pliku) Można w pliku nagłówkowym dać extern const, a potem w jednym z plików źródłowych zdefiniować wartości tablicy, wtedy nie ma duplikacji.
0

Wszystko śmiga dzięki wielkie za pomoc.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Ja trochę nie ogarniam. Przecież dodanie tam "static" zmienia zupełnie sens tego pola!


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
byku_guzio
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 7 lat
0

No ale raczej nie ma sensu w ten sposób robić stałej tablicy jako zmiennej obiektu, wystarczy, że będzie zmienną klasy. Gdyby się dało zainicjalizować tą tablicę na liście inicjalizacyjnej konstruktora to wtedy miałoby to sens. Nie wiem czy jakiś kompilator to już obsługuje(chyba da się w c++ 11).


byku_guzio
Niestety cl jeszcze nie :/

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.