155178 Temat założony przez niniejszego użytkownika |
» 2018-01-10 17:16:01 Wydanie siódme. Zrobiłem coś takiego, aby sprawdzić czy wszystko zadziała : Kolo.h #pragma once class Kolo { friend class Samochod; int rozmiar; explicit Kolo( int rozmiar ); public: int getRozmiar(); ~Kolo(); };
Kolo.cpp #include "Kolo.h"
Kolo::Kolo( int rozmiar ) { this->rozmiar = rozmiar; }
Kolo::~Kolo() { }
int Kolo::getRozmiar() { return rozmiar; } Samochod.h #pragma once #include<string> #include<iostream> #include"Silnik.h" #include"Kolo.h" #include"DodatkoweWyposazenie.h" #define nkol 4 #define nwyp 5 using namespace std;
class Samochod { Kolo kola[ nkol ]; explicit Samochod( int rozmiarKol ); public: Samochod(); ~Samochod(); };
Samochod.cpp #include "Samochod.h"
Samochod::Samochod() { }
Samochod::~Samochod() { }
Samochod::Samochod( int rozmiarKol ) : kola { Kolo( rozmiarKol ), Kolo( rozmiarKol ), Kolo( rozmiarKol ), Kolo( rozmiarKol ) } { } Czyli wszystko niby powinno działać prawidłowo, ponieważ jest tylko Kolo kola[4]; w klasie Samochod i konstruktory znajdują się w liście inicjalizacyjnej konstruktora klasy Samochod. A dostaję dwa błędy : samochod.cpp(6): error C2512: "Kolo": niedostępny odpowiedni konstruktor domyślny kolo.h(3): note: zobacz deklarację „Kolo” Mógłby ktoś mi wyjaśnić gdzie nadal popełniam błąd? Chciałem zacząć od samych kół a później dołożyć resztę, aby dobrze zrozumieć zasadę działania. A co do kolejności chodziło o to, aby jeżeli jest mojej klasie Samochod deklaracja : 1.Silnik silnik; 2.Kolo kola[nkol]; 3.String nazwa; To przy konstruktorze po : była ta sama kolejność, racja? |
|
Lora |
» 2018-01-10 17:24:10 W konstruktorze bezparametrowym samochodu również musisz umieścić konstruktory kół na liście inicjalizującej. Albo dodać konstruktor bezparametrowy do klasy Kolo. |
|
155178 Temat założony przez niniejszego użytkownika |
» 2018-01-10 17:40:04 Rzeczywiście, to rozwiązało problem. Dziękuję bardzo. Zabieram się za budowanie pełnego konstruktora klasy Samochod. W razie problemów wstawię kod po edycji, także proszę o nie zamykanie jeszcze tematu. Dobudowałem coś takiego : Samochod::Samochod( string nazwa, int moc, int liczbaCylindrow, int rozmiarKol ) : silnik( Silnik( moc, liczbaCylindrow ) ) , kola { Kolo( rozmiarKol ), Kolo( rozmiarKol ), Kolo( rozmiarKol ), Kolo( rozmiarKol ) } { this->nazwa = nazwa; } I niby rzeczywiście nie wyrzuca żadnych błedów, ale jak ktoś wyżej wspomniał "nazwa powinna być w liście inicjalizacyjnej". Czy takie przypisanie nazwy jest niepoprawne i dlaczego? Rzeczywiście jest potrzeba zamieniać to na : Samochod::Samochod( string nazwa, int moc, int liczbaCylindrow, int rozmiarKol ) : silnik( Silnik( moc, liczbaCylindrow ) ) , kola { Kolo( rozmiarKol ), Kolo( rozmiarKol ), Kolo( rozmiarKol ), Kolo( rozmiarKol ) }, nazwa { nazwa } { } ? Oraz jaka jest różnica w działaniu? I zostaje jeszcze kwestia DodatkowegoWyposazenia. Na początku ma nie być żadnego dodatkowego wyposazenia, więc chyba mogę pominąć to w konstruktorze, racja? A później po prostu poprzez metodę dodajWyposazenie wywoływać konstruktor DodatkoweWyposazenie i przypisywać je do tablicy? Dobrze rozumuję? Jeszcze mam pytanie co do metody Samochod( const Samochod & samochod ); to powinien być zwykły cctor, prawda? W jaki sposób go zaimplementować w tej klasie ? W klasie dodatkowe wyposazenie to było łatwiejsze. |
|
YooSy |
» 2018-01-10 20:46:01 Czy takie przypisanie nazwy jest niepoprawne i dlaczego? |
Jest poprawne. Różnica jest w inicjalizacji pola. W liście używasz bezpośrednio konstruktora dla std::stringnatomiast w ciele konstruktora tworzysz napis konstruktorem domyślnym i później używasz operatora kopiującego. I zostaje jeszcze kwestia DodatkowegoWyposazenia. Na początku ma nie być żadnego dodatkowego wyposazenia, więc chyba mogę pominąć to w konstruktorze, racja? A później po prostu poprzez metodę dodajWyposazenie wywoływać konstruktor DodatkoweWyposazenie i przypisywać je do tablicy? Dobrze rozumuję? |
O ile Wyposażenie będzie odrębną klasą ,niech wyposażenie dodatkowe zawiera listę wyposażenia i obiekt utwórz od razu z pustą listą. W między czasie można po prostu dodawać wyposażenie do listy. Samochod( const Samochod & samochod ); |
To jest konstruktor kopiujący i o ile nie pożyczasz od sytemu pamięci lub innych zasobów i nie potrzebujesz pisać destruktora, należy pozostawić go kompilatorowi do zbudowania. Zwykle robi to lepiej i efektywniej. rule of three five zero |
|
155178 Temat założony przez niniejszego użytkownika |
» 2018-01-10 22:41:25 Destruktor będę musiał zbudować, więc nie wiem jak to zadziała. Plus wolałbym jawnie zbudować ten konstruktor kopiujący, żeby samemu wiedzieć na przyszłość jak go zrobić. W jaki sposób przekopiować obiekty silnik oraz kola[nkol]? Bo z nazwą jest prosto : nazwa = samochod.nazwa; |
|
155178 Temat założony przez niniejszego użytkownika |
» 2018-01-11 00:03:37 I jeszcze jedna kwestia : jak napisać destruktor klasy Samochod, aby od razu wykonywał destruktory kół oraz silnika? Będzie to wyglądało tak jak w przypadku konstruktora czyli lista destruktora klasy Samochod zawierać ma kola{~Kolo(),~Kolo(),~Kolo(),~Kolo()} oraz silnik{~Silnik()} ? |
|
pekfos |
» 2018-01-11 00:17:39 W twoim przypadku destruktor będzie pusty, więc możesz go w ogóle nie definiować. |
|
1551 |
» 2018-01-11 01:42:55 Czyli z automatu przy usuwaniu obiektu klasy Samochód usune 4 koła i silnik? Pusty nie będzie bo muszę odjąć ilośćSamochodow o 1, ponieważ posiadam zmienne globalne służące do zliczania obiektów danych klas. I jak będzie to działać : 1. Po wpisaniu delete „jakiś obiekt klasy samochód” - zadziała destruktor klasy Samochod i usunie 4 koła, dodatkowe wyposażenie i obiekt klasy silnik? 2. Zadziała destruktor klasy samochód, a następnie wywoła 4 destruktory klasy kolo, destruktor klasy silnik oraz n destruktorką klasy dodatkoweWyposazenie?
|
|
1 2 3 « 4 » 5 |