Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Matt91111

[C++] Określanie wielkości tablic w konstruktorze

Rekomendowane odpowiedzi

Tak jak w temacie, potrzebóję określić wielkość tablic przy wywołaniu konstruktora(statyczne stałe nie wchodzą w gre, dla każdego obiektu liczba tablic będzie inna), z góry dzięki za info ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Bardzo mało precyzyjnie opisałeś co chcesz zrobić.

Jeżeli próbujesz zrobić coś w stylu

class A
{
  int tab[X]; //X do okreslenia w konstruktorze
};

to coś takiego nie ma prawa wypalić, ponieważ rozmiar każdego obiektu tej samej klasy musi być taki sam.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A nie szukasz przypadkiem czegoś takiego?

 

class A {

int* a;

public:
 A(const int x) {
   a = new int[x];
 }
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A nie szukasz przypadkiem czegoś takiego?

 

class A {

int* a;

public:
 A(const int x) {
   a = new int[x];
 }
}

 

Wiem ,że można zrobić to w ten sposób ale chciałem uniknąć dynamicznego przydziału pamięci

 

Bardzo mało precyzyjnie opisałeś co chcesz zrobić.

Jeżeli próbujesz zrobić coś w stylu

class A
{
  int tab[X]; //X do okreslenia w konstruktorze
};

to coś takiego nie ma prawa wypalić, ponieważ rozmiar każdego obiektu tej samej klasy musi być taki sam.

 

Dokładnie o to mi chodziło, ale skoro nie da się w ten sposób to pozostaje mi przydział ze sterty

Dzięki za pomoc :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Do zastosowań praktycznych najlepiej Ci będzie ogarnąć vector, ręczne alokowanie tablic jest dla masochistów.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Do zastosowań praktycznych najlepiej Ci będzie ogarnąć vector, ręczne alokowanie tablic jest dla masochistów.

Zapewniam cię ,że nie jestem masochistą :E, vektorami posługiwać się umiem ,ale zostane przy tablicach

Mimo wszystko dzięki za rade ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zapewniam cię ,że nie jestem masochistą :E, vektorami posługiwać się umiem ,ale zostane przy tablicach

Mimo wszystko dzięki za rade ;)

 

class Foo
{
 private: vector<int> v;
 public:  int* p; // tablica

 Foo() : v(x, 0), p(v.data()) {}
}

 

Poprawne dopóki nie przealokujesz wektora.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Poprawne dopóki nie przealokujesz wektora.

Wektor przealokowywuje się sam, czyli bez dodatkowego sprawdzania używanie tego pointera nie ma wielkiego sensu jeżeli tylko będą dodawane/usuwane elementy.

Już do czegoś takiego lepszy getter, chociaż i tak zupełnie nie wiemy co zamierza robić autor tematu :E

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wektor przealokowywuje się sam

 

Nie, mylisz się.

 

Wektor przealokowuje się (czasem) przy zmianie rozmiaru i przy reserve().

Autor chce określić rozmiar w konstruktorze, czyli rozmiar jego tablicy ma być stały.

 

https://isocpp.org/std/the-standard

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

 

strona 770:

Remarks:

Reallocation invalidates all the references, pointers, and iterators referring to the elements

in the sequence. It is guaranteed that no reallocation takes place during insertions that happen after

a call to reserve() until the time when an insertion would make the size of the vector greater than

the value of capacity()

.

 

I jeśli potrzeba koniecznie pointera, to rozwiązanie jest poprawne, aczkolwiek bezsensowne, i lepiej tak jak mówiłeś, wziąć vector / array.

 

Achh, przepraszam, nie doczytałem:

jeżeli tylko będą dodawane/usuwane elementy

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiem ,że można zrobić to w ten sposób ale chciałem uniknąć dynamicznego przydziału pamięci

 

a czemuż to?

 

class A
{
  int tab[X]; //X do okreslenia w konstruktorze
};

 

coś takiego nazywa się VLA (variable length arrays) i jest.... niezgodne ze standardem :E

 

owszem - da się tego użyć w gcc, clang czy kompilatorze M$ ale to jest tylko dodatek

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

VLA używa się w kodzie, a nie przy definiowaniu klasy. Gdyby coś takiego było dopuszczalne, to składowe klasy po takiej tablicy miałyby nieokreślony offset, co już zupełnie nie miałoby sensu.

Kwoli ścisłości: VLA są normalną konstrukcją w C, natomiast niedozwoloną w C++: kompilatory mają rozszerzenia dopuszczające to w kodzie C++, ale powinno się tego unikać.

Jakieś upośledzone VLA miało podobno wylądować w standardzie '14 :E

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...