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 ===|