Dziedziczenie - dlaczego nie działa const przy przeciążeniu operatora << ?

0

mam takie klasy

#ifndef _CLASS_DZIEDZICZENIE
#define _CLASS_DZIEDZICZENIE

#include <string>

class pracownik
{
    private:
        std::string m_fullName;
        std::string m_adres;
        unsigned int m_nip;
    public:
        pracownik() {};
        pracownik(const char * imie, const char * adres, unsigned int nip);
        pracownik(const std::string imie, const std::string adres, unsigned int nip);
        
        virtual void show(void);
        
        friend std::ostream & operator<<(std::ostream & os, const pracownik & x);
};

class programista : virtual public pracownik
{
    private:
        std::string m_language;
    public:
        programista() : pracownik() {};
        programista(const char * imie, const char * adres, unsigned int nip, const char * jezyk);
        programista(std::string imie, std::string adres, unsigned int nip, std::string jezyk);
        
        virtual void show(void);
        
        friend std::ostream & operator<<(std::ostream & os, programista & x);        
};

class piosenkarz : virtual public pracownik
{
    private:
        int voisceStrenght;
    public:
        piosenkarz() : pracownik() {};
        piosenkarz(const char * imie, const char * adres, unsigned int nip, int glos);
        piosenkarz(std::string imie, std::string adres, unsigned int nip, int glos);
        
        virtual void show(void);
        
        friend std::ostream & operator<<(std::ostream & os, piosenkarz & x);
};
#endif

i problem mam taki, przy przeciązeniu operatora << w klasach które dziedziczą po klasie pracownik nie moge dac const przy moim obiekcie

czyli jak napisze tak

 friend std::ostream & operator<<(std::ostream & os, const piosenkarz & x);
 friend std::ostream & operator<<(std::ostream & os, const programista & x);  

i tak samo dopisze const w definicji to kompilator zgłasza błąd

undefined reference to operator<<(std::ostream&, programista& undefined reference to operator<<(std::ostream&, piosenkarz&)

oto zawartość tych funkcji

std::ostream & operator<<(std::ostream & os, const pracownik & x)
{
    os << "Imie i nazwisko: " << x.m_fullName << std::endl
       << "Adres: " << x.m_adres << std::endl
       << "NIP: " << x.m_nip << std:: endl;
       
    return os;
}
std::ostream & operator<<(std::ostream & os, programista & x)
{
    os << (const pracownik &)x;
    os << "Jezyk: " << x.m_language << std::endl;
    
    return os;
}
std::ostream & operator<<(std::ostream & os, piosenkarz & x)
{
    os << (const pracownik &)x;
    os << "Sila glosu: " << x.voisceStrenght << std::endl;
    
    return os;
}

jak widać klasa bazowa posiada to const i kompilator się nieskarży więc dlaczego przy dziedziczeniu sie skarzy??

0
friend std::ostream & operator<<(std::ostream & os, piosenkarz & x);
friend std::ostream & operator<<(std::ostream & os, const programista & x);  

Nie widzisz różnicy?

0

pierwsze przyjmuje referencje do obiektu klasy piosenkarz, a drugie stałą referencje do obiektu klasy programista.

czyli to pierwsze może zmieniać zawartość a to drugie nie.

ale to drugie mi nie chce działać

0

Pewnie zostawiłeś gdzieś deklarację std::ostream & operator<<(std::ostream & os, piosenkarz & x); i, gdy przekazujesz non-const obiekt typu piosenkarz to to przeładowanie jest wybierane - a potem linker płacze, że takiego nie widzi.

0

nie dopisuje const wszedzie

oto plik nagłówkowy i z funkcjami

i powiedz mi co tu jest źle, bo nie widze

#define _CLASS_DZIEDZICZENIE

#include <string>

```cpp
class pracownik
{
    private:
        std::string m_fullName;
        std::string m_adres;
        unsigned int m_nip;
    public:
        pracownik() {};
        pracownik(const char * imie, const char * adres, unsigned int nip);
        pracownik(const std::string imie, const std::string adres, unsigned int nip);
        
        virtual void show(void);
        
        friend std::ostream & operator<<(std::ostream & os, const pracownik & x);
};

class programista : virtual public pracownik
{
    private:
        std::string m_language;
    public:
        programista() : pracownik() {};
        programista(const char * imie, const char * adres, unsigned int nip, const char * jezyk);
        programista(std::string imie, std::string adres, unsigned int nip, std::string jezyk);
        
        virtual void show(void);
        
        friend std::ostream & operator<<(std::ostream & os, const programista & x);        
};

class piosenkarz : virtual public pracownik
{
    private:
        int voisceStrenght;
    public:
        piosenkarz() : pracownik() {};
        piosenkarz(const char * imie, const char * adres, unsigned int nip, int glos);
        piosenkarz(std::string imie, std::string adres, unsigned int nip, int glos);
        
        virtual void show(void);
        
        friend std::ostream & operator<<(std::ostream & os, const piosenkarz & x);
};
/*
class piosenkarz_programista : private programista, private piosenkarz
{
    public:
        piosenkarz_programista();
        piosenkarz_programista(const char * imie, const char * adres, unsigned int nip, int glos, const char * jezyk);
        
        void show(void);
};
*/
#endif
#include <iostream>
#include <string>

#include "class.h"
//=======================PRACOWNIK==========================================
pracownik::pracownik(const char * imie, const char * adres, unsigned int nip) : m_fullName(imie), m_adres(adres)
{
    m_nip = nip;
}
pracownik::pracownik(const std::string imie, const std::string adres, unsigned int nip) : m_fullName(imie), m_adres(adres)
{
    m_nip = nip;
}
void pracownik::show(void)
{
    std::cout << "Imie i nazwisko: " << m_fullName << std::endl
              << "Adres: " << m_adres << std::endl
              << "NIP: " << m_nip << std:: endl;
}

std::ostream & operator<<(std::ostream & os, const pracownik & x)
{
    os << "Imie i nazwisko: " << x.m_fullName << std::endl
       << "Adres: " << x.m_adres << std::endl
       << "NIP: " << x.m_nip << std:: endl;
       
    return os;
}
//=======================PROGRAMISTA=========================================
programista::programista(const char * imie, const char * adres, unsigned int nip, const char * jezyk) : pracownik(imie, adres, nip), m_language(jezyk)
{ }
programista::programista(std::string imie, std::string adres, unsigned int nip, std::string jezyk) : pracownik(imie, adres, nip), m_language(jezyk)
{ }

void programista::show(void)
{
    pracownik::show();
    std::cout << "Jezyki: " << m_language << std::endl;
}

std::ostream & operator<<(std::ostream & os, const programista & x)
{
    os << (const pracownik &)x;
    os << "Jezyk: " << x.m_language << std::endl;
    
    return os;
}
//======================PIOSENKARZ============================================
piosenkarz::piosenkarz(const char * imie, const char * adres, unsigned int nip, int glos) : pracownik(imie, adres, nip), voisceStrenght(glos)
{ }
piosenkarz::piosenkarz(std::string imie, std::string adres, unsigned int nip, int glos) : pracownik(imie, adres, nip), voisceStrenght(glos)
{ }

void piosenkarz::show(void)
{
    pracownik::show();
    std::cout << "Sila glosu: " << voisceStrenght << std::endl;
}

std::ostream & operator<<(std::ostream & os, const piosenkarz & x)
{
    os << (const pracownik &)x;
    os << "Sila glosu: " << x.voisceStrenght << std::endl;
    
    return os;
}
//====================PIOSENKARZ-PROGRAMISTA===================================
0

Chrzani waść, wszystko gra tak jak powinno być: http://ideone.com/gDmdpq

W tym co podałeś brakuje:

  1. #ifndef _CLASS_DZIEDZICZENIE w pliku class.h
  2. #include "class.h" w pozostałych plikach
0

a ja mam takie problemy

http://www.pl.image-share.com/ijpg-246-10.html

a wszędzie dopisałem ten const

0

visual to skompilował z tymi const ale dev nie,

1

Na ideone masz ten sam kompilator co używa Dev
Wiec coś ochrzaniłeś w projekcie czy przypadkiem nie dowaliłeś plików nagłówkowych do projektu?

0

wszystko jest dołączone jak trzeba
w majnie #include "class.h"
oraz w pliku gdzie sa funkcje do klas tez taki include jest,
i wszystko mi działa dopóki nie dopisze tych const.

w visual zrobiłem tylko kopiuj wklej z deva i tam działa z const i bez const

0

Więc otwórz drugiego Deva i zrób dokładnie takiego samego kopiuj wklej.

0

ok zrobiłem tak i działa, ale dlaczego tamten wciąż nie działa, a było tylko kopiuj wklej

1 użytkowników online, w tym zalogowanych: 0, gości: 1