Strona 1 z 1

[c++] Dynamiczna alokacja tablicy w klasie.

: 17 kwie 2009, 17:01
autor: wilek
Witam!

Podczas kompilacji tego kodu mam kilka błędów,

Kod: Zaznacz cały

#include<iostream>
using namespace std;
class wybor
{
	public:
        int rozmiar = 5;
		int *liczby = new int[rozmiar];
};

int main()
{
		
}
i niestety mam takie błędy:
sort.cpp:9: error: ISO C++ forbids initialization of member ?rozmiar?
sort.cpp:9: error: making ?rozmiar? static
sort.cpp:9: error: ISO C++ forbids in-class initialization of non-const static member ?rozmiar?
sort.cpp:10: error: ?wybor::rozmiar? cannot appear in a constant-expression
sort.cpp:10: error: `new' cannot appear in a constant-expression
sort.cpp:10: error: ISO C++ forbids initialization of member ?liczby?
sort.cpp:10: error: making ?liczby? static
sort.cpp:10: error: invalid in-class initialization of static data member of non-integral type ?int*?
gdy deklaruje tą tablice w mainie to nie ma błędów żadnych.

Odp: [c++] Dynamiczna alokacja tablicy w klasie.

: 17 kwie 2009, 17:59
autor: jackweb
1. Przy definiowaniu pól klasy nie wykonasz żadnego funkcji (tudzież new), więc musisz je uruchomić w jakiejś metodzie, najlepiej w konstruktorze, specjalnie do tego przeznaczonym przecież.
2. Spotkałem się z błędem przy nadawaniu domyślnych wartości pól klasy, więc ustawiłem je w konstruktorze; innym sposobem jest dodanie dwóch magicznych słów przy definiowaniu pola rozmiar - const static.

Odp: [c++] Dynamiczna alokacja tablicy w klasie.

: 18 kwie 2009, 20:17
autor: mikolajs
2. Spotkałem się z błędem przy nadawaniu domyślnych wartości pól klasy, więc ustawiłem je w konstruktorze;
Nie można inicjowaći pól klasy w jej definicji - nie jest to żaden błąd, być może pomyliło Ci się z Javą lub C#
Dodanie const static powoduje, że wszytkie obiekty klasy będą mieć jedeno wspólne pole i nie można zmienić jego wartości.

Odp: [c++] Dynamiczna alokacja tablicy w klasie.

: 19 kwie 2009, 09:37
autor: jackweb
mikolajs: no jedyna ta wada, że nie można zmieniać zawartości pola. Co proponujesz wzamian? Punkt pierwszy czy jak?

Odp: [c++] Dynamiczna alokacja tablicy w klasie.

: 19 kwie 2009, 12:00
autor: clansman5
zdecydowanie punkt 1. W przypadku 2. zmienna statyczna jest wspolna dla wszystkich obiektow utworzonych na podstawie definicji klasy.

Odp: [c++] Dynamiczna alokacja tablicy w klasie.

: 19 kwie 2009, 20:03
autor: mikolajs
mikolajs: no jedyna ta wada, że nie można zmieniać zawartości pola. Co proponujesz wzamian? Punkt pierwszy czy jak?
Wszystko zależy od tego co chce się uzyskać. Powyższy kod równie dobrze moża by zastąpić

Kod: Zaznacz cały

int liczby[5]
Oczywiście standardowe rozwiązanie to inicjacja zmiennej i tworzenie tablicy w konstruktorze. Jeżeli rozmiar liczby[] miałby się zmieniać to należałoby w razie potrzeby utworzyć nową tablicę i kopiować jej zawartość (oczywiście zwalniając starą), jednak w takim wypadku lepiej użyć wektora.
Użycie stałej statycznej też może być dobre jeżeli chcemy odczytywać z klasy rozmiary tablicy o stałej wielkości. (ale w tym przypadku i tak wolałbym użyć wektora :) )