155178 Temat założony przez niniejszego użytkownika |
» 2018-01-08 21:11:52 Jakoś nie mogę dojść do tego w jaki sposób zrobić kompozycję. Mógłby ktoś poprawić dla mnie klasę Samochód? To co wklejone zostało na wandbox jest dla mnie czarną magią - nigdy takiego zapisu w c++ nie widziałem, kiedy przekopiowałem to do deva - wyskoczyła cała masa błedów, że zapisy nie są prawidłowe i nie otrzymałem rezultatu takiego jak na stronie.
@EDIT Wstawię za moment diagram UML oraz swoje rozwiązanie i prosiłbym o sprawdzenie poprawności implementacji w miarę możliwości. Jakoś do godziny 23 powinienem się wyrobić i wrzucić rozwiązanie. |
|
pekfos |
» 2018-01-08 21:45:41 kiedy przekopiowałem to do deva |
I tu właśnie leży problem. |
|
155178 Temat założony przez niniejszego użytkownika |
» 2018-01-08 22:07:22 Rzeczywiście w VS 2017 działa jak na stronie. Dziękuję. W czym leży problem z devem? Używa zbyt starego standardu? Za jakiś czas wstawię cały swój kod do sprawdzenia i będę liczył na sugestię poprawek o ile będą konieczne. |
|
155178 Temat założony przez niniejszego użytkownika |
» 2018-01-08 23:27:32 #include<iostream> #include"LiczbaObiektow.h" #include"Kolo.h" #include"Silnik.h" #include"DodatkoweWyposazenie.h" #include"Samochod.h" #include"FabrykaSamochodow.h" using namespace std;
int main() { Samochod * wzorzec = Samochod::dajWzorzec( "Peugeot", 16, 140, 4 ); wzorzec->wyswietlSpecyfikacje(); wzorzec->dodajWyposazenie( new DodatkoweWyposazenie( "radio" ) ); FabrykaSamochodow * fab = new FabrykaSamochodow(); getchar(); getchar(); return 0; }
#pragma once class Kolo { friend class Samochod; int rozmiar; Kolo( int rozmiar ); public: int getRozmiar(); ~Kolo(); };
#include "Kolo.h"
Kolo::Kolo( int rozmiar ) { this->rozmiar = rozmiar; }
Kolo::~Kolo() { }
int Kolo::getRozmiar() { return rozmiar; } #pragma once class Silnik { friend class Samochod; int moc; int liczbaCylindrow; Silnik( int moc, int liczbaCylindrow ); public: int getMoc(); int getLiczbaCylindrow(); ~Silnik(); };
#include "Silnik.h"
Silnik::Silnik( int moc, int liczbaCylindrow ) { this->moc = moc; this->liczbaCylindrow = liczbaCylindrow; }
Silnik::~Silnik() { }
int Silnik::getMoc() { return moc; } int Silnik::getLiczbaCylindrow() { return liczbaCylindrow; } #pragma once #include<string> #include<iostream>
using namespace std; class DodatkoweWyposazenie { protected: string nazwa; public: void getnazwa(); DodatkoweWyposazenie( string nazwa ); ~DodatkoweWyposazenie(); DodatkoweWyposazenie( const DodatkoweWyposazenie & wyp ); };
#include "DodatkoweWyposazenie.h"
DodatkoweWyposazenie::DodatkoweWyposazenie( string nazwa ) { this->nazwa = nazwa; }
DodatkoweWyposazenie::~DodatkoweWyposazenie() { }
void DodatkoweWyposazenie::getnazwa() { cout << endl << nazwa; }
DodatkoweWyposazenie::DodatkoweWyposazenie( const DodatkoweWyposazenie & wyp ) { nazwa = wyp.nazwa; } #pragma once #include<iostream> #include"DodatkoweWyposazenie.h" #include"Silnik.h" #include"Kolo.h" #define nkol 4 #define nwyp 5 #include"LiczbaObiektow.h"
using namespace std;
class Samochod { Silnik * silnik; Kolo * kola[ nkol ]; string nazwa; int ldw; DodatkoweWyposazenie * wyposazenie[ nwyp ]; Samochod( string nazwa, int moc, int liczbaCylindrow, int rozmiarKol ); public: Samochod( const Samochod & samochod ); Samochod & operator =( const Samochod & other ); static Samochod * dajWzorzec( string nazwa, int moc, int liczbaCylindrow, int rozmiarKol ); void wyswietlSpecyfikacje(); void dodajWyposazenie( DodatkoweWyposazenie * wyposazenie ); ~Samochod(); };
#include "Samochod.h"
Samochod::Samochod( string nazwa, int moc, int liczbaCylindrow, int rozmiarKol ) { this->nazwa = nazwa; silnik = new Silnik( moc, liczbaCylindrow ); for( int i = 0; i <= nkol; i++ ) { kola[ i ] = new Kolo( rozmiarKol ); } ldw = 0; }
Samochod::Samochod( const Samochod & samochod ) { silnik = samochod.silnik; nazwa = samochod.nazwa; for( int i = 0; i <= nkol; i++ ) { kola[ i ] = samochod.kola[ i ]; } for( int i = 0; i < samochod.ldw; i++ ) { wyposazenie[ i ] = samochod.wyposazenie[ i ]; } ldw = ldw; }
Samochod::~Samochod() { }
Samochod * Samochod::dajWzorzec( string nazwa, int moc, int liczbaCylindrow, int rozmiarKol ) { return new Samochod( nazwa, moc, liczbaCylindrow, rozmiarKol ); }
void Samochod::wyswietlSpecyfikacje() { cout << "\nNazwa samochodu : " << nazwa; cout << "\nMoc silnika : " << silnik->moc; cout << "\nLiczba cylindrow silnika : " << silnik->liczbaCylindrow; cout << "\nRozmiar kol : " << kola[ 0 ]->rozmiar; if( liczbaDodatkowegoWyposazenia > 0 ) { cout << "\nDodatkowe wyposazenie : "; for( int i = 0; i < ldw; i++ ) { wyposazenie[ i ]->getnazwa(); } } }
void Samochod::dodajWyposazenie( DodatkoweWyposazenie * wyposazenie ) { this->wyposazenie[ ldw ] = wyposazenie; ldw++; liczbaDodatkowegoWyposazenia++; }
Samochod & Samochod::operator =( const Samochod & other ) { if( this != & other ) std::cout << "assing\n"; return * this; } #pragma once #include"Samochod.h"
class FabrykaSamochodow { public: FabrykaSamochodow(); ~FabrykaSamochodow(); };
#include "FabrykaSamochodow.h"
FabrykaSamochodow::FabrykaSamochodow() { }
FabrykaSamochodow::~FabrykaSamochodow() { }
#include "LiczbaObiektow.h" int liczbaSamochodow = 0; int liczbaKol = 0; int liczbaDodatkowegoWyposazenia = 0; int liczbaSilnikow = 0; int liczbaSalonow = 0; int liczbaFabryk = 0; Zaciąłem się w tym miejscu. Nie wiem w jaki sposób zrobić relację kompozycji tak jak na diagramie UML Samochod<--Silnik oraz Samochod<--Kolo. Mam także problem z metodą wyprodukujSamochod z klasy FabrykaSamochodow. Mógłby ktoś pomóc? Tutaj diagram UML : https://imgur.com/zksZ0WC @Monika90 Dziękuję za pomoc. |
|
Monika90 |
» 2018-01-08 23:57:21 Tak się nie powinno programować w C++. |
|
Lora |
» 2018-01-09 00:51:30 Olej ten diagram i zrób tak jak ci inni pisali. Z klas Kolo i Silnik wyrzuć friend class Samochod i przenieś konstruktory do części publicznej. I nigdzie nie zwalniasz zaalokowanej przez new pamięci. |
|
155178 Temat założony przez niniejszego użytkownika |
» 2018-01-09 01:05:54 Obawiam się, że diagram został specjalnie wykonany w taki sposób, aby wykorzystać pojęcie klasy zaprzyjaźnionej, kompozycji oraz zablokować możliwość używania niektórych konstruktorów i zmusić do korzystania z metod publicznych tych klas.
Najgorsze w tym wszystkim jest to, że nie mogę znaleźć nigdzie dobrze wyjaśnionego pojęcia kompozycji wraz z tłumaczeniem implementacji w języku C++. |
|
Lora |
» 2018-01-09 01:41:39 Kompozycja, czyli zawieranie określa relację "ma-coś", czyli określa czy jakiś element jest częścią drugiego. Koła i silnik są częściami samochodu więc zachodzi tu relacja "ma-coś", dlatego używamy kompozycji, co oznacza, że silnik i koła mają być polami klasy Samochod: class Samochod { Silnik silnik; Kolo kola[ 4 ]; };
Zaprzyjaźnienie natomiast stosuje się jeśli jedna klasa może zmieniać stan innej klasy, to znaczy jej pola prywatne. Przykładem może być telewizor i pilot. Pilot nie jest częścią telewizora, ani telewizor nie jest częścią pilota, więc nie powinniśmy stosować kompozycji, ale mimo to pilot może zmieniać stan telewizora, jak na przykład przełączać kanały. W tym przypadku pilot jest przyjacielem telewizora i ma dostęp do jego pól prywatnych takich jak numer kanału itd. class Telewizor { friend class Pilot; };
Natomiast koła i silnik są częściami samochodu, a nie jego przyjaciółmi i samochód powinien korzystać z ich publicznych interfejsów. Swoją drogą na diagramie nigdzie nie jest zaznaczone, że ich konstruktory mają być prywatne. |
|
1 « 2 » 3 4 5 |