Cześć Przerabiam sobie książkę "Od zera do gier kodera" i mam mały problem z jednym programem. Książka jest dość "stara" bo z 2004 i pewnie nie wszystko co tam zostało zaprezentowane jest zgodne z dzisiejszymi standardami, dlaczego chciałbym rozwiać wątpliwości Oto kod:
PLIK main.cpp
// Polymorphism - wykorzystanie techniki polimorfizmu
#include <iostream>
#include <conio.h>
#include "documents.h"
int main()
{
std::cout << " POLIMORFIZM " << std::endl;
std::cout << "-----------------" << std::endl;
// wskaźnik na obiekty dokumentów
CDocument* pDokument;
// pierwszy dokument - internetowy
std::cout << std::endl << "--- 1. pozycja ---" << std::endl;
pDokument = new COnlineDocument("Regedit",
"Cyfrowe przetwarzanie tekstu",
"http://programex.risp.pl/?"
"strona=cyfrowe_przetwarzanie_tekstu");
pDokument->PokazDane();
delete pDokument;
// drugi dokument - książka
std::cout << std::endl << "--- 2. pozycja ---" << std::endl;
pDokument = new CBook("Sam Williams", "W obronie wolnosci", "83-7361-247-5");
pDokument->PokazDane();
delete pDokument;
getch();
}
document.h
// Plik nagłówkowy z definicjami klas dokumentów
#include <string>
#include <time.h>
// klasa dowolnego dokumentu
class CDocument
{
protected:
// podstawowe dane dokumentu
std::string m_strAutor; // autor dokumentu
std::string m_strTytul; // tytuł dokumentu
tm m_Data; // data stworzenia
public:
// konstruktory
CDocument()
{ m_strAutor = m_strTytul = "???";
time_t Czas = time(NULL); m_Data = *localtime(&Czas); }
CDocument(std::string strTytul)
{ CDocument(); m_strTytul = strTytul; }
CDocument(std::string strAutor, std::string strTytul)
{ CDocument();
m_strAutor = strAutor;
m_strTytul = strTytul; }
//------------------------------------------------------------------------------------
// metody
virtual void PokazDane();
// metody dostępowe do pól
std::string Autor() const { return m_strAutor; }
std::string Tytul() const { return m_strTytul; }
tm Data() const { return m_Data; }
};
//----------------------------------------------------------------------------------------
// dokument internetowy
class COnlineDocument : public CDocument
{
protected:
std::string m_strURL; // adres internetowy dokumentu
public:
// konstruktory
COnlineDocument(std::string strAutor, std::string strTytul)
{ m_strAutor = strAutor; m_strTytul = strTytul; }
COnlineDocument(std::string strAutor,
std::string strTytul,
std::string strURL)
{ m_strAutor = strAutor;
m_strTytul = strTytul;
m_strURL = strURL; }
//------------------------------------------------------------------------------------
// metody
void PokazDane(); // wirtualna metoda przedefiniowana z CDocument
// metody dostępowe do pól
std::string URL() const { return m_strURL; }
};
// książka
class CBook : public CDocument
{
protected:
std::string m_strISBN; // numer ISBN książki
public:
// konstruktory
CBook(std::string strAutor, std::string strTytul)
{ m_strAutor = strAutor; m_strTytul = strTytul; }
CBook(std::string strAutor,
std::string strTytul,
std::string strISBN)
{ m_strAutor = strAutor;
m_strTytul = strTytul;
m_strISBN = strISBN; }
//------------------------------------------------------------------------------------
// metody
void PokazDane(); // także wirtualna, przedefiniowana metoda
// metody dostępowe do pól
std::string ISBN() const { return m_strISBN; }
};
document.cpp
// Modu³ implementuj¹cy klasy dokumentów
#include <iostream>
#include "documents.h"
/*---------------------------------------------------------------------------------------
CDocument - implementacja klasy
---------------------------------------------------------------------------------------*/
void CDocument::PokazDane()
{
// wyœwietlenie autora
std::cout << "AUTOR: ";
std::cout << m_strAutor << std::endl;
// pokazanie tytu³u dokumentu
// (sekwencja \" wstawia cudzys³ów do napisu)
std::cout << "TYTUL: ";
std::cout << "\"" << m_strTytul << "\"" << std::endl;
// data utworzenia dokumentu
// (pDokument->Data() zwraca strukturê typu tm, do której pól
// mo¿na dostaæ siê tak samo, jak do wszystkich innych - za
// pomoc¹ operatora wy³uskania . (kropki))
std::cout << "DATA : ";
std::cout << m_Data.tm_mday << "." << (m_Data.tm_mon + 1) << "."
<< (m_Data.tm_year + 1900) << std::endl;
}
/*---------------------------------------------------------------------------------------
COnlineDocument - implementacja klasy
---------------------------------------------------------------------------------------*/
void COnlineDocument::PokazDane()
{
// najpierw pokazujemy dane odziedziczone z CDocument,
// wiêc wywo³ujemy wersjê metody pochodz¹c¹ z tej klasy
CDocument::PokazDane();
// dalej wyœwietlamy URLa
std::cout << "URL : ";
std::cout << m_strURL << std::endl;
}
/*---------------------------------------------------------------------------------------
CBook - implementacja klasy
---------------------------------------------------------------------------------------*/
void CBook::PokazDane()
{
// wyœwietlamy dane z CDocument
CDocument::PokazDane();
// pokazujemy numerek ISBN
std::cout << "ISBN : ";
std::cout << m_strISBN << std::endl;
}
Pierwsze pytanie odnosi się do pliku main.cpp, a konkretnie chodzi mi o to że podczas kompilacji wyskakuje ostrzeżenie: main.cpp|23|warning: deleting object of polymorphic class type 'CDocument' which has non-virtual destructor might cause undefined behaviour [-Wdelete-non-virtual-dtor]| Co dokładnie trzeba zrobić by rozwiązać ten problem?
Drugie tyczy się konstruktorów z klasy CDocument w pliku document.h przeciążony operator wywołuje nieprzeciążony, który ustawia datę, ale gdy chciałem stworzyć obiekt z klasy CDocument z dwoma parametrami, albo jednym to wywołanie bezparametrowego konstruktora najwyraźnej nic nie daje bo jako data ustawione są jakieś bilionowe liczby. Czy teraz działa to jakoś inaczej?Poza tym znacie jakieś inne tak szczegółowe kursy C++ jak "Od zera do gier kodara"?