[C++]Konstruktory i błędy[SOLVED]

0

W zasadzie nazwa tematu to tylko połowa prawdy ale zaraz wytlumacz w czym problem.
Chwilowo oto kod programu.
main.cpp

#include <iostream>
#include"lib.h"
using namespace std;

int main()
{
    cBok* Ksiazka;
    Ksiazka=new cBok("Janek",
                     "Naucz sie C++",
                     271090);
    cPdf* Pedeef;
    Pedeef=new cPdf("GWiesiek",
                    "Umiem C++",
                    "http://google.pl");

    cout<<"Dane książki:" <<endl;
    Ksiazka->Pokaz();
    delete Ksiazka;

    cout<<"Dane pdf:" <<endl;
    Pedeef->Pokaz();
    delete Pedeef;

    system("PAUSE");
    return 0;
}

biblioteka

class IDoc
{
    protected:
                std::string m_AUTOR;
                std::string m_TYTUL;
    public:
            IDoc()
            {
                m_AUTOR=m_TYTUL="...";
            }
            IDoc(std::string strTytul)
            {
                IDoc();
                m_TYTUL=strTytul;
            }
            IDoc(std::string strAutor, std::string strTytul)
            {
                IDoc();
                m_AUTOR=strAutor;
                m_TYTUL=strTytul;
            }
            virtual ~IDoc(){}
            virtual void Pokaz();
};

class cBok : public IDoc
{
    protected:
                int m_NUMER;
    public:
            cBok()
            {
                m_NUMER=0000;
            }
            cBok(int numerek)
            {
                cBok();
                m_NUMER=numerek;
            }
            cBok(std::string autorek, std::string tytulik,int numerek)
            {
                cBok();
                m_AUTOR=autorek;
                m_TYTUL=tytulik;
                m_NUMER=numerek;
            }
            ~cBok(){}
            void Pokaz();
};

class cPdf : public IDoc
{
    protected:
                std::string m_ADRES;
    public:
            cPdf()
            {
                m_ADRES="NIEZNANY";
            }
            cPdf(std::string adresik)
            {
                cPdf();
                m_ADRES=adresik;
            }
            cPdf(std::string autorek, std::string tytulik, std::string adresik)
            {
                cPdf();
                m_AUTOR=autorek;
                m_TYTUL=tytulik;
                m_ADRES=adresik;
            }
            ~cPdf(){}
            void Pokaz();
};

Metody klasy


#include<iostream>
#include"lib.h"

using namespace std;

void cBok::Pokaz()
{
    cout<<"AUTOR: "     <<m_AUTOR <<endl;
    cout<<"TYTUL: "     <<m_TYTUL <<endl;
    cout<<"NUMER: "     <<m_NUMER <<endl;
}

void cPdf::Pokaz()
{
    cout<<"AUTOR: "     <<m_AUTOR <<endl;
    cout<<"TYTUL: "     <<m_TYTUL <<endl;
    cout<<"POCHODZENIE" <<m_ADRES <<endl;

}

Oto otrzymywane logi z kompilatora.

C:\Users\draqun\Documents\CPP\Obiekty 4 Dziedziczenie\main.cpp|10|error: no matching function for call to `cBok::cBok(const char[14], const char[14], const char[7])'|
C:\Users\draqun\Documents\CPP\Obiekty 4 Dziedziczenie\lib.h|27|note: candidates are: cBok::cBok(const cBok&)|
...
C:\Users\draqun\Documents\CPP\Obiekty 4 Dziedziczenie\main.cpp|14|error: no matching function for call to `cPdf::cPdf(const char[14], const char[10], const char[17])'|
C:\Users\draqun\Documents\CPP\Obiekty 4 Dziedziczenie\lib.h|45|note: candidates are: cPdf::cPdf(const cPdf&)|

Owy błąd przyprawił mnie o małe bóle głowy. Dotyczy on linii w funkcji main() i nie bardzo wiem jak się błędu pozbyć.

Inną sprawą sa te konstruktory

            IDoc()
            {
                m_AUTOR=m_TYTUL="...";
            }
            IDoc(std::string strTytul)
            {
                IDoc();
                m_TYTUL=strTytul;
            }
            IDoc(std::string strAutor, std::string strTytul)
            {
                IDoc();
                m_AUTOR=strAutor;
                m_TYTUL=strTytul;
            }

Nispecjalnie rozumiem zasadę działania tego kawałka. Liczyłem, że jak skompiluje program, trochę podebuguje to załapie ale program się nie kompiluje więc nici. Waracając do tematu.
Z tego co widzę na moje krzywe oko

  • Perwszy konstruktor przypisuje zmiennym m_AUTOR i m_TYTUL po ...
  • Drugi w zasadzie przyjmuje jako parametr stringa i przypisuje jego wartość zmiennej m_TYTUL
  • Trzeci robi to samo co drugi z tym, że robi to dla dwóch zmiennych. Czy to ma większy sens? Jeszcze raz przyjmować parametr, który był przyjmowany w innym konstruktorze i przypisywać go tej samej zmiennej? Czy jak posiadamy konstruktor numer trzy potrzebny jest konstruktor numer dwa? Czy może ma to sens ponieważ nie zawsze musimy podać autora(w takim razie analogicznie nie zawsze musimy podać tytułu ;) i potrzebny bylby tylko konstruktor dla autora)?
    IDoc* Ksiazka;
    Ksiazka=new cBok("Janek",
                     "Naucz sie C++",
                     "271090");

Ten kawałek jest chyba jasny ale chce sie upewnić. Pierwsze dwie dane przekazywane są do konstruktora, który przyjmuje autora i tytuł w klasie bazowej, natomiast trzecia dana czyli numer jest przekazywana do konstruktora w klasie pochodnej?

Pozdrawiam. Z góry dziękuje za odpowiedzi, a ja tymczasem lecę spojrzeć co na to inne kursy.


EDYTKA.
Ok. Błąd znaleziony. Poprawiłem powyższy kod. Zrozumiałem działania konstruktorów tzn. Konstruktory to przewidywalne wywołanie działania metod, podająć odpowiednia ilość parametrów. W moim przypadku kod był dostosowany do 1 i 2 paramterów w przypadku klasy bazowej i do 1 paramteru dla klas pochodnych. Tym razem klasy pochodne są przyszykowane na 1 lub 3 parametry. Aktualne błędy jakie dostaje dotyczą destruktorów

)]+0x4c)||In function `ZN4cBokC1Ev':|
C:\Users\draqun\Documents\CPP\Obiekty 4 Dziedziczenie\lib.h||undefined reference to `vtable for cPdf'|
)]+0x7e):C:\Users\draqun\Documents\CPP\Obiekty 4 Dziedziczenie\lib.h||undefined reference to `cPdf::~cPdf()'|
)]+0x109)||In function `main':|
C:\Users\draqun\Documents\CPP\Obiekty 4 Dziedziczenie\main.cpp|6|undefined reference to `IDoc::~IDoc()'|
obj\Debug\main.o(.text$_ZN4cPdfC1Ev[cPdf::cPdf()]+0x4c)||In function `ZN4cBokC1Ev':|
C:\Users\draqun\Documents\CPP\Obiekty 4 Dziedziczenie\lib.h||undefined reference to `vtable for cPdf'|
obj\Debug\main.o(.text$_ZN4cPdfC1Ev[cPdf::cPdf()]+0xca):C:\Users\draqun\Documents\CPP\Obiekty 4 Dziedziczenie\lib.h||undefined reference to `IDoc::~IDoc()'|
obj\Debug\main.o(.text$_ZN4IDocC2Ev[IDoc::IDoc()]+0x3a):C:\Users\draqun\Documents\CPP\Obiekty 4 Dziedziczenie\lib.h||undefined reference to `vtable for IDoc'|
 int)]+0x4c):C:\Users\draqun\Documents\CPP\Obiekty 4 Dziedziczenie\lib.h||undefined reference to `vtable for cBok'|
 int)]+0x69):C:\Users\draqun\Documents\CPP\Obiekty 4 Dziedziczenie\lib.h||undefined reference to `cBok::~cBok()'|
 int)]+0xbf):C:\Users\draqun\Documents\CPP\Obiekty 4 Dziedziczenie\lib.h||undefined reference to `IDoc::~IDoc()'|
obj\Debug\main.o(.text$_ZN4cBokC1Ev[cBok::cBok()]+0x16):C:\Users\draqun\Documents\CPP\Obiekty 4 Dziedziczenie\lib.h||undefined reference to `vtable for cBok'|
||=== Build finished: 10 errors, 0 warnings ===|
0

Nigdzie nie definiujesz tych destruktorów

0

Ok zdefiniowane. (kod poprwiony biblioteki wyżej).
Aktualnie dostaje dziwne błędy

obj\Debug\pok.o(.text$_ZN4IDocD2Ev[IDoc::~IDoc()]+0x3a)||In function `ZN4IDocD2Ev':|
C:\Users\draqun\Documents\CPP\Obiekty 4 Dziedziczenie\lib.h||undefined reference to `vtable for IDoc'|
obj\Debug\main.o(.text$_ZN4IDocC2Ev[IDoc::IDoc()]+0x3a)||In function `ZN4cBokC1Ev':|
C:\Users\draqun\Documents\CPP\Obiekty 4 Dziedziczenie\lib.h||undefined reference to `vtable for IDoc'|
||=== Build finished: 2 errors, 0 warnings ===|

Nie bardzo rozumiem, co ma siedzieć w takim destruktorze. Przecież nie przypisuje pamięci poszczegolnym zmiennym tylko całemu obiektowi.

0
#include <iostream>
using namespace std;



class IDoc
{
    protected:
                std::string m_AUTOR;
                std::string m_TYTUL;
    public:
            IDoc()
            {
                m_AUTOR=m_TYTUL="...";
            }
            IDoc(std::string strTytul)
            {
                IDoc();
                m_TYTUL=strTytul;
            }
            IDoc(std::string strAutor, std::string strTytul)
            {
                IDoc();
                m_AUTOR=strAutor;
                m_TYTUL=strTytul;
            }
            virtual ~IDoc(){}
            virtual void Pokaz(){/*NIC*/} ;
};

class cBok : public IDoc
{
    protected:
                int m_NUMER;
    public:
            cBok()
            {
                m_NUMER=0000;
            }
            cBok(int numerek)
            {
                cBok();
                m_NUMER=numerek;
            }
            cBok(std::string autorek, std::string tytulik,int numerek)
            {
                cBok();
                m_AUTOR=autorek;
                m_TYTUL=tytulik;
                m_NUMER=numerek;
            }
            ~cBok(){}
            void Pokaz();
};

class cPdf : public IDoc
{
    protected:
                std::string m_ADRES;
    public:
            cPdf()
            {
                m_ADRES="NIEZNANY";
            }
            cPdf(std::string adresik)
            {
                cPdf();
                m_ADRES=adresik;
            }
            cPdf(std::string autorek, std::string tytulik, std::string adresik)
            {
                cPdf();
                m_AUTOR=autorek;
                m_TYTUL=tytulik;
                m_ADRES=adresik;
            }
            ~cPdf(){}
            void Pokaz();
};
//--------------------------------------------------------------------
void cBok::Pokaz()
{
    cout<<"AUTOR: "     <<m_AUTOR <<endl;
    cout<<"TYTUL: "     <<m_TYTUL <<endl;
    cout<<"NUMER: "     <<m_NUMER <<endl;
}

void cPdf::Pokaz()
{
    cout<<"AUTOR: "     <<m_AUTOR <<endl;
    cout<<"TYTUL: "     <<m_TYTUL <<endl;
    cout<<"POCHODZENIE" <<m_ADRES <<endl;

}

int main()
{
    cBok* Ksiazka;
    Ksiazka=new cBok("Janek",
                     "Naucz sie C++",
                     271090);
    cPdf* Pedeef;
    Pedeef=new cPdf("GWiesiek",
                    "Umiem C++",
                    "http://google.pl");

    cout<<"Dane książki:" <<endl;
    Ksiazka->Pokaz();
    delete Ksiazka;

    cout<<"Dane pdf:" <<endl;
    Pedeef->Pokaz();
    delete Pedeef;

    system("PAUSE");
    return 0;
}

Musisz zdefiniować virtualną funkcję Pokaz w IDoc , IDoc nie jest tutaj klasą czysto wirtualną i kompilator poszukuje def. funkcji .
Og. kod jest typu lipa , jeśli zadeklarujesz fun jako czysto virtual fun()=0 ; i tak jest możliwość prób utworzenia obiektu IDoc ze względu na konstruktory
które zdefiniowałeś dla tej klasy - impas .
Chociaż zależy co pan programista miał na myśli odnośnie poziomu głębokości abstrakcji .

0

Ok problem rozwiązany :) dzięki wielkie. Taki głupi błąd :). Kod jest lipa, bo się dopiero uczę. Na własną rękę w domciu.

Pozdrawiam.

0

Przy okazji popraw sygnaturkę na Takich 3 .... Obecna jest bez sensu.

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