[c++] Kilka pytań na temat tworzenia tablicy obiektów.

0

Witam,
Dlaczego jeśli tworzę tablicę obiektów nie mogę wywołać konstruktora.

figura *wskf;
wskf = new figura[15];
wskf = new figura[15](5, 5); //tutaj wywala błąd, nie mogę wywołać konstruktora.
wskf = new figura(5, 5)[15]; //tutaj tez wywala błąd, nie mogę wywołać konstruktora.

Ponadto dlaczego jeśli tworzę tablicę obiektów następnie ją usuwam, to po usunięciu wciąż mogę korzystać z tego obszaru i wszystkie metody dla obiektu pokazują poprawne liczby.

figura *wskf;
wskf = new figura[15];
wskf->ustaw_bok(2);
wskf->czytaj_bok();
delete[]wskf;
wskf->czytaj_bok(); //dlaczego moge dalej wskazywac na ten obszar skoro jest zwolniony a wartość wskf->czytaj_bok() jest taka sama jak przed delete ?
0
matiash napisał(a)

Witam,
Dlaczego jeśli tworzę tablicę obiektów nie mogę wywołać konstruktora.

bo jeżeli tworzysz tablicę obiektów to klasa musi posiadać konstruktor bez argumentów, który można wywołać. Nie ma w C++ składni, która pozwoliłaby osiągnąć to co chcesz.

Możesz stworzyć tablicę wskaźników na obiekty i utworzyć każdy obiekt osobno - wtedy możesz wywołać taki konstruktor, jaki chcesz.

matiash napisał(a)

Ponadto dlaczego jeśli tworzę tablicę obiektów następnie ją usuwam, to po usunięciu wciąż mogę korzystać z tego obszaru i wszystkie metody dla obiektu pokazują poprawne liczby.

Nie możesz. Masz po prostu szczęście, że te wartości nie zostały jeszcze nadpisane nowymi. delete "oddaje pamięć" do ponownego użycia. Nigdzie nie jest powiedziane, że delete zeruje pamięć czy wypełnia ją śmieciami.

0

Dziękuję, mam jeszcze jedno pytanie,

dlaczego jak tworzę dwa obiekty tego samego typu to nie mogę zrobić operacji:

figura kwadrat1(2,2);
figura kwadrat2(4,4);

kwadrat1 = kwadrat2; //sygnalizuje błąd.

0

Jaki błąd?

0

[C++ Error] Unit1.cpp(25): E2125 Compiler could not generate operator= for class 'figura'

0

Bo nie masz przeładowanego operatora przypisania.

0

Hmm to juz podpinajac sie pod temat, moze mi ktos wytlumaczyc ta konstrukcje?jakim sposobem mozna wywolac metode klasy nie tworzac jej obiektu?

#include <iostream>

class myclass
{

public:
    void call() const { std::cout << "Hello, World!" << std::endl; }
};

int main()
{
myclass* ptr=NULL;
ptr->call();   
return 0;
}
0
Himself napisał(a)

Hmm to juz podpinajac sie pod temat, moze mi ktos wytlumaczyc ta konstrukcje?jakim sposobem mozna wywolac metode klasy nie tworzac jej obiektu?

tworzysz funkcję statyczną i w maine wywołujesz ją korzystając z operatora zasięgu: nazwaKlasy::nazwaFunkcji();

0

@up nie zrozumiałeś pytania, on się pytał dlaczego ten kod działa skoro nie tworzy obiektu tylko ma znullowany wskaźnik na typ tej klasy.

0

Wywołanie metody przez pusty wskaźnik wg standardu nie ma zdefiniowanego zachowania jednak większość kompilatorów to łyknie dopóki nie odwołujesz się do instancji tego obiektu (wtedy też łykną ale będziesz miał segmentation fault :)

0
... napisał(a)

większość kompilatorów to łyknie dopóki nie odwołujesz się do instancji tego obiektu

instancji tej klasy oczywiście drobna pomyłka :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1