[C++] Konstruktor konwertujący.

Awatar użytkownika
Pneumokok
Użytkownik
Użytkownik
Posty: 48
Rejestracja: 2 sty 2011, o 14:29
Płeć: Mężczyzna
Lokalizacja: Małopolska
Podziękował: 11 razy
Pomógł: 1 raz

[C++] Konstruktor konwertujący.

Post autor: Pneumokok »

Witam!

Na wstępie chciałbym podziękować koledze Afishowi za pomoc przy ostatnim problemie -> klik. Teraz niestety zmuszony jestem Was prosić o pomoc przy kolejnym.
Otóż:
Chcąc przypomnieć sobie jak działa konstruktor konwertujący, postanowiłem napisać program zawierajacy dwie klasy - Szyba i Okno. Zamierzałem konwertować obiekt klasy Szyba na obiekt klasy Okno wychodząc z założenia, że szyba jest szczególnym przypadkiem okna które nie ma ram okiennych - niekoniecznie ma to sens, ale i sam program służyć ma tylko przypomnieniu jak konwersja się odbywa.
Oto kody:

plik main.cpp
Ukryta treść:    
Plik Okno.h:
Ukryta treść:    
Plik Okno.cpp:
Ukryta treść:    
Plik Szyba.h:
Ukryta treść:    
Plik Szyba.cpp:
Ukryta treść:    
Idea jest następująca - tworzę konstruktor klasy Okno przyjmujacy jako argument obiekt klasy Szyba, dzięki temu że klasa Szyba jest zaprzyjaźniona z owym konstruktorem klasy Okno może on (a przynajmniej powinien móc, o ile program by działał) używać składowych prywatnych klasy Szyba jakby były publiczne.

Otrzymuję następujący błąd kompilacji:
Ukryta treść:    
Problem w tym, że nie bardzo wiem, jak sprawić by klasa Szyba wiedziała, że Okno jest nazwą klasy i na odwrót. Różne kombinacje z deklaracjami zapowiadajacymi (na górze każdego pliku, wspomina o nich Grębosz w Symfonii) lub ich brakiem (ujęcie w komentarz) nie powiodły się i dają podobne błędy. ,,Extern class" również nie pomaga.

Z góry dziękuję za pomoc przy rozwiązaniu problemu.
Pozdrawiam,
Pneumokok.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] Konstruktor konwertujący.

Post autor: Afish »

W pliku Okno.cpp załączaj oba nagłówki (Okno.h i Szyba.h). W pliku Okno.h daj

Kod: Zaznacz cały

#ifndef OKNO_H
#define   OKNO_H
class Szyba;

class Okno {
public:
    Okno(int tSzerokoscSzyby=50, int tWysokoscSzyby=180, int szerokoscRamki=15, int wysokoscRamki=10);
    Okno(const Okno& orig);
    Okno(const Szyba szyba);
    virtual ~Okno();
    void pokazInfo();
private:
    const int szerokoscSzyby;
    const int wysokoscSzyby;
    int szerokoscRamki;
    int wysokoscRamki;
};

#endif   /* OKNO_H */
W pliku Szyba.h daj

Kod: Zaznacz cały

#ifndef SZYBA_H
#define   SZYBA_H
#include "Okno.h"


class Szyba {
public:
    Szyba(int tSzerokoscSzyby=50, int tWysokoscSzyby=180);
    Szyba(const Szyba& orig);
    virtual ~Szyba();
    void pokazInfo();
    const int getWysokoscSzyby() const;
    const int getSzerokoscSzyby() const;
    friend Okno::Okno(Szyba);
private:
    const int szerokoscSzyby;
    const int wysokoscSzyby;

};

#endif   /* SZYBA_H */
Dla ścisłości - w temacie chodziło Ci zapewne o konstruktor kopiujący.
Awatar użytkownika
Pneumokok
Użytkownik
Użytkownik
Posty: 48
Rejestracja: 2 sty 2011, o 14:29
Płeć: Mężczyzna
Lokalizacja: Małopolska
Podziękował: 11 razy
Pomógł: 1 raz

[C++] Konstruktor konwertujący.

Post autor: Pneumokok »

Afish pisze:W pliku Okno.cpp załączaj oba nagłówki (Okno.h i Szyba.h). W pliku Okno.h(...)
Dziękuję za pomoc - mam jeszcze jedną małą prośbę, mógłbyś wyjaśnić czemu akurat tak? Problem odpowiedniego załączania plików do siebie pewnie mi się powtórzy, a jak się człek raz porządnie nauczy to mniej potem zachodu
Afish pisze:Dla ścisłości - w temacie chodziło Ci zapewne o konstruktor kopiujący.
Właśnie nie - chodziło mi o konstruktor konwertujący, czy właściwie o konwersję konstruktorem - jaką Grębosz w Symfonii opisuje w II tomie, na str. 686: ,,18.2.2 Przykład konwersji konstruktorem".
Przy czym konstruktor

Kod: Zaznacz cały

Okno::Okno(const Szyba szyba)
Nie robi być może nic charakterystycznego co winien taki konstruktor robić i na jedno by wyszło gdyby uznać go za kopiujący(lecz by był kopiujacy nie musi przypadkiem dostać referencji do oryginału zamiast kopii?).
Kod:
Ukryta treść:    
Zdaje się działać poprawnie, jest więc konwersja - choć być może nie jest ona senso stricte konieczna.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] Konstruktor konwertujący.

Post autor: Afish »

Pneumokok pisze:
Afish pisze:W pliku Okno.cpp załączaj oba nagłówki (Okno.h i Szyba.h). W pliku Okno.h(...)
Dziękuję za pomoc - mam jeszcze jedną małą prośbę, mógłbyś wyjaśnić czemu akurat tak? Problem odpowiedniego załączania plików do siebie pewnie mi się powtórzy, a jak się człek raz porządnie nauczy to mniej potem zachodu :)
Okno.cpp będzie wyciągało na przykład prywatne pola klasy Szyba, więc musi wiedzieć, co i jak może uzyskać - do tego potrzebuje deklaracji pól i metod, czyli najprościej załączyć nagłówek.
Pneumokok pisze:
Afish pisze:Dla ścisłości - w temacie chodziło Ci zapewne o konstruktor kopiujący.
Właśnie nie - chodziło mi o konstruktor konwertujący, czy właściwie o konwersję konstruktorem - jaką Grębosz w Symfonii opisuje w II tomie, na str. 686: ,,18.2.2 Przykład konwersji konstruktorem".
Przy czym konstruktor

Kod: Zaznacz cały

Okno::Okno(const Szyba szyba)
Nie robi być może nic charakterystycznego co winien taki konstruktor robić i na jedno by wyszło gdyby uznać go za kopiujący(lecz by był kopiujacy nie musi przypadkiem dostać referencji do oryginału zamiast kopii?).
Kod:
Ukryta treść:    
Zdaje się działać poprawnie, jest więc konwersja - choć być może nie jest ona senso stricte konieczna.
Okej, być może w polskiej nomenklaturze jest to konstruktor konwertujący, mi kompilator krzyczał o copy constructor, więc stąd moja uwaga. Najwyraźniej to Ty masz rację.
Awatar użytkownika
Pneumokok
Użytkownik
Użytkownik
Posty: 48
Rejestracja: 2 sty 2011, o 14:29
Płeć: Mężczyzna
Lokalizacja: Małopolska
Podziękował: 11 razy
Pomógł: 1 raz

[C++] Konstruktor konwertujący.

Post autor: Pneumokok »

Ok, już wszystko wiem. Dziękuję jeszcze raz za pomoc A sam temat do zamknięcia.
ODPOWIEDZ