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-10 17:16:01
Wydanie siódme.
Zrobiłem coś takiego, aby sprawdzić czy wszystko zadziała :
Kolo.h
C/C++
#pragma once
class Kolo
{
    friend class Samochod;
    int rozmiar;
    explicit Kolo( int rozmiar );
public:
    int getRozmiar();
    ~Kolo();
};
Kolo.cpp
C/C++
#include "Kolo.h"



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


Kolo::~Kolo()
{
}


int Kolo::getRozmiar()
{
    return rozmiar;
}
Samochod.h
C/C++
#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
{
    //Silnik silnik;
    Kolo kola[ nkol ];
    //string nazwa;
    //DodatkoweWyposazenie wyposazenie[nwyp];
    //explicit Samochod(string nazwa, int moc, int liczbaCylindrow, int rozmiarKol)
    explicit Samochod( int rozmiarKol );
public:
    Samochod();
    ~Samochod();
};
Samochod.cpp
C/C++
#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?
P-168577
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.
P-168578
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 :
C/C++
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 :
C/C++
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.
P-168579
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::string
natomiast 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
P-168593
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;
P-168603
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()} ?
P-168612
pekfos
» 2018-01-11 00:17:39
W twoim przypadku destruktor będzie pusty, więc możesz go w ogóle nie definiować.
P-168616
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?

P-168619
1 2 3 « 4 » 5
Poprzednia strona Strona 4 z 5 Następna strona