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ść
1551
» 2018-01-09 13:27:41
Dziękuje, trochę już rozumiem. Czyli klasa samochód zawiera w sobie klasę kolo oraz silnik? I używamy tego bez wskaźników, jak wiec korzystać z tego przy tworzeniu samochodu? Jak powinien wyglądać konstruktor samochód po tych zmianach?

Konstruktory tych klas(silnik oraz koło) na diagramie znajdują się po znaku „-„ co oznacza ze maja być prywatne.
P-168524
155178
Temat założony przez niniejszego użytkownika
» 2018-01-10 15:36:58
Próbowałem zrobić konstruktor klasy Samochod analogicznie do tych klas na wandboxie i mam problem ponieważ :
C/C++
Samochod( string & nazwa, int & moc, int & liczbaCylindrow, int & rozmiarKol )
    : nazwa
{ nazwa }, silnik { moc, liczbaCylindrow }, kola[ 0 ] { rozmiarKol }, kola[ 1 ] { rozmiarKol }, kola[ 2 ] { rozmiarKol }, kola[ 3 ] { rozmiarKol }
{ }
coś takiego nie daje efektu. W jaki sposób zbudować ten konstruktor?

Fragmenty z wandbox :
C/C++
Engine( double ca, const std::string & ty )
    : capacity
{ ca },
type { ty }
{ }
private:
double capacity;
std::string type;





public:
Wheel( int in )
    : inch
{ in } { }
private:
int inch;



Car( const std::string & br, const Engine & en, const Wheel & wh )
    : brand
{ br },
engine { en },
wheel { wh }
{ }

private:
std::string brand;
Engine engine;
Wheel wheel;



int main()
{
    Car crysler { "Crysler", Engine { 6.1, "hemi" }, Wheel { 19 } };
    std::cout << crysler.ToString() << std::endl;
    getchar();
}
 
Jak tutaj wyglądałby kod jeżeli klasa Car miałaby konstruktor o argumentach :
C/C++
string brand;
double capacity;
string type;
int inch;
 a nie gotowych już Enigne& en oraz const Wheel& wh.
P-168570
YooSy
» 2018-01-10 16:21:59
Napisz konstruktory z parametrami w klasach silnik i koło
i w liście inicjalizacyjnej konstruktora klasy samochód wywołaj
te konstruktory.
P-168571
155178
Temat założony przez niniejszego użytkownika
» 2018-01-10 16:28:44
C/C++
Kolo::Kolo( int rozmiar )
{
    this->rozmiar = rozmiar;
}

C/C++
Silnik::Silnik( int moc, int liczbaCylindrow )
{
    this->moc = moc;
    this->liczbaCylindrow = liczbaCylindrow;
}

Tak wyglądają konstruktory tych klas. Właśnie nie wiem w jaki sposób wywołać te konstruktory w liście inicjalizacyjnej konstruktora klasy Samochod. Musi to być konstruktor o podanych w poście wyżej argumentach. To powinno wyglądać jakoś tak ? :
C/C++
Samochod::Samochod( string nazwa, int moc, int liczbaCylindrow, int rozmiarKol )
    : Silnik::Silnik( moc, liczbaCylindrow )
     , Kolo::Kolo( rozmiarKol )
{
    this->nazwa = nazwa;
}

Jak zawrzeć te 4 koła w tym konstruktorze i przypisać je do tej tablicy?

Bo przy tej wyżej używam jednego konstruktora klasy Kolo i nie wiem czy w ogóle będzie on miał związak z zawartym w klasie Samochod :
Kolo kola[ nkol ];
. Przepraszam za głupie pytania, ale na prawdę się już w tym pogubiłem strasznie, a nigdzie nie mogę znaleźć dokładnie opisanego tego zagadnienia wraz z praktycznymi przykładami.
P-168572
Monika90
» 2018-01-10 16:37:24

class Kolo
{
public:
    friend class Samochod;
private:
    explicit Kolo(int) { }
};

class Samochod
{
public:
    explicit Samochod(int n)
    :
    kola{Kolo(n), Kolo(n), Kolo(n), Kolo(n)}
    { }
   
private:
    Kolo kola[4];
};

int main()
{
    Samochod s(9);
}



a nigdzie nie mogę znaleźć dokładnie opisanego tego zagadnienia wraz z praktycznymi przykładami.
To powinno być w każdym podręczniku C++.
P-168573
155178
Temat założony przez niniejszego użytkownika
» 2018-01-10 16:59:18
Przerabiam aktualnie "Język C++" Stroustrup'a i jeszcze nie natrafiłem na taką implementację(działu odnośnie kompozycji też nie mogłem znaleźć). Jest to obszerny podręcznik więc być może w końcu do tego dojdę, szukając w internecie nie mogłem nigdzie znaleźć tych informacji z ładnym wytłumaczeniem i przykładami.

Czyli mój konstruktor klasy Samochod powinien wyglądać tak :
C/C++
Samochod::Samochod( string nazwa, int moc, int liczbaCylindrow, int rozmiarKol )
    : kola
{ Kolo( rozmiarKol ), Kolo( rozmiarKol ), Kolo( rozmiarKol ), Kolo( rozmiarKol ) }, silnik { Silnik( moc, liczbaCylindrow ) }
{
    this->nazwa = nazwa;
}
 ? Dobrze zrozumiałem ? Wykorzystuję konstruktory jawne Kolo oraz Silnik podczas wywoływania konstruktora Samochod? Czy powyższy zapis jest poprawny?
Przy tym dostaję błędy : "Silnik: niedostępny odpowiedni konstruktor domyślny" oraz "Kolo: niedostępny odpowiedni konstruktor domyślny"
P-168574
Monika90
» 2018-01-10 17:09:46
Które wydanie Stroustrupa?

Wygląda na poprawny, choć wg mnie lepiej będzie tak

Samochod::Samochod(string nazwa, int moc, int liczbaCylindrow, int rozmiarKol)
    :
    silnik{moc, liczbaCylindrow},
    kola{Kolo(rozmiarKol), Kolo(rozmiarKol), Kolo(rozmiarKol), Kolo(rozmiarKol)},
    nazwa{nazwa}
{ }


Zadbaj o to by kolejność na liście inijalizacyjnej była taka sama jak kolejność deklaracji w klasie (chodzi o kolejność składowych silnik, kola, nazwa).
P-168575
YooSy
» 2018-01-10 17:09:54
nazwa też powinna być w liście inicjalizacyjnej.
P-168576
1 2 « 3 » 4 5
Poprzednia strona Strona 3 z 5 Następna strona