Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wykorzystanie konstruktorów klasy zaprzyjaźnionej w innej klasie

Ostatnio zmodyfikowano 2018-01-11 23:40
Autor Wiadomość
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.
P-168505
pekfos
» 2018-01-08 21:45:41
kiedy przekopiowałem to do deva
I tu właśnie leży problem.
P-168508
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.
P-168509
155178
Temat założony przez niniejszego użytkownika
» 2018-01-08 23:27:32
C/C++
#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" ) );
    //wzorzec->wyswietlSpecyfikacje();
    FabrykaSamochodow * fab = new FabrykaSamochodow();
    getchar();
    // Samochod *autko = fab->wyprodukujSamochod(wzorzec);
    //autko->wyswietlSpecyfikacje();
    getchar();
    return 0;
}
C/C++
#pragma once
class Kolo
{
    friend class Samochod;
    int rozmiar;
    Kolo( int rozmiar );
public:
    int getRozmiar();
    ~Kolo();
};
C/C++
#include "Kolo.h"



Kolo::Kolo( int rozmiar )
{
    this->rozmiar = rozmiar;
}


Kolo::~Kolo()
{
}


int Kolo::getRozmiar()
{
    return rozmiar;
}
C/C++
#pragma once
class Silnik
{
    friend class Samochod;
    int moc;
    int liczbaCylindrow;
    Silnik( int moc, int liczbaCylindrow );
public:
    int getMoc();
    int getLiczbaCylindrow();
    ~Silnik();
};
C/C++
#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;
}
C/C++
#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 );
};
C/C++
#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;
}
C/C++
#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();
};
C/C++
#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";
    // Zwrócenie referencji do samego siebie
    return * this;
}
C/C++
#pragma once
#include"Samochod.h"

class FabrykaSamochodow
{
public:
    FabrykaSamochodow();
    ~FabrykaSamochodow();
};
C/C++
#include "FabrykaSamochodow.h"



FabrykaSamochodow::FabrykaSamochodow()
{
}


FabrykaSamochodow::~FabrykaSamochodow()
{
}
C/C++
#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.
P-168513
Monika90
» 2018-01-08 23:57:21
Tak się nie powinno programować w C++.
P-168515
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.
P-168516
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++.
P-168517
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:
C/C++
class Samochod
{
    //Samochod zawiera silnik i cztery kola:
    Silnik silnik;
    Kolo kola[ 4 ]; // lepiej std::array< Kolo, 4 >, jesli mozesz
   
    //...
};

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.
C/C++
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.
P-168520
1 « 2 » 3 4 5
Poprzednia strona Strona 2 z 5 Następna strona