Jump to content

Archived

This topic is now archived and is closed to further replies.

t3tris

Rozwiązany: [C++] Rozmiar tablicy statycznej przekazywanej jako argument konstruktora klasy szablonowej

Recommended Posts

Cześć.

Mam otóż pewien problem - potrzebuję sposobu na to, jak ustalić rozmiar tablicy, która została przekazana jako argument konstruktora.

Dla przykładu:

int tablica[100];
for (int i = 0; i < 100; ++i)
    tablica[i] = i;

KlasaSzablonowa<int> obiekt(tablica);

Potrzebuję metody na "wydobycie" z tablicy jej rozmiaru. Początkowo miałem myśl, żeby przepisać całą tablicę do nowej, a potem na koniec nowej wstawić NULL, a potem poszłoby już łatwo, ale c++ nie jest językiem, gdzie instrukcja tab1=tab2 dawałaby oczekiwane rezultaty ;P

Sizeof nie działa, bo zwraca rozmiar wskaźnika, a nie tablicy. Z góry dzięki za pomoc. ;]

Link to comment
Share on other sites

Jak dla mnie to przykład "mało obiektowego myślenia". Po co wyciągać sztuczkami coś, co można przekazać?

const int TAB_SIZE = 100;
int tablica[TAB_SIZE];
for (int i = 0; i < TAB_SIZE; ++i)
    tablica[i] = i;

KlasaSzablonowa<int> obiekt(tablica, TAB_SIZE);

Link to comment
Share on other sites

Hmm, ewidentnie źle opisałem problem.

Tablicę statyczną będę miał przekazaną z zewnątrz, moja klasa wie o niej tyle, że wskaźnik do jej pierwszego elementu jest argumentem jednego z jej konstruktorów. Nie mam pojęcia jaki będzie rozmiar tej tablicy. Ta którą przytoczyłem to przykład.

Tak się teraz zastanawiam - istnieją może jakieś tajemne metody na "przepisanie" tablicy na vector albo inny pojemnik(oczywiście dalej mówię o takiej, której rozmiaru nie znam)? Bo wtedy funkcja size użyta w stosunku do pojemnika załatwia sprawę.

Link to comment
Share on other sites

Ok, z tym, że ciągle nie wiem jak tę tablicę przepisać nie znając jej rozmiaru. A z innego źródła wiem, że jest sposób, aby ten rozmiar ustalić. Niestety inne źródło jest złośliwe, i powiedzieć mi nie chce jak to zrobić. ;P

Link to comment
Share on other sites

A ja Ci mówię, że się nie da ustalić rozmiaru tablicy na podstawie samej tylko tablicy. Przekazuj jej rozmiar jako parametr, albo skorzystaj z wektora.

Do przepisania teoretycznie można by skorzystać z memcpy:

int src[xxx];
std::vector<int> vec;
vec.reserve(xxx);

int * dst = &vec[0];

Teraz tylko wywołujemy memcpy z src do dst.

Problem jednak w tym, że nie masz pewności, że vector zarezerwuje ciągły obszar pamięci. Dlatego z tablicy do vectora najlepiej jest przepisać element po elemencie.

Link to comment
Share on other sites

No, udało mi się znaleźć rozwiązanie - przedstawię na wypadek jakby się miało kiedyś komuś przydać:

//Konstruktor wywołujemy w ten sposób:
template<size_t N>
    KlasaSzablonowa(TypElementów (&tab)[N])

Wtedy niezależnie od tego jakiej wielkości tablicę przekażemy WYŁĄCZNIE przez użycie jej nazwy będziemy mogli używać N jako jej rozmiaru.

Do zamknięcia.

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.


  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...