Baza danych w c++, niewidoczne konstruktory w tablicach obiektów

0

A więc stworzyłem sobie klasę abstrakcyjną, z której dziedziczy reszta klas.

 #pragma once
 
#include <string.h>
#include <iostream>
 
 
using namespace std;
 
class ksiazka
{
protected:
 
    string tytul;
    string autor;
    string gatunek;
    string okladka;
    string wydawnictwo;
 
    int rok_wyd;
 
    float cena;
 
    float dlugosc;
    float wysokosc;
    float szerokosc;
 
public:
    void set_tytul(string);
    void set_autor(string);
    void set_gatunek(string);
    void set_okladka(string);
    void set_wydawnictwo(string);
    void set_rok_wyd(int);
    void set_cena(float);
    void set_dlugosc(float);
    void set_wysokosc(float);
    void set_szerokosc(float);
 
    string get_tytul();
    string get_autor();
    string get_gatunek();
    string get_okladka();
    string get_wydawnictwo();
    int get_rok_wyd();
    float get_cena();
    float get_dlugosc();
    float get_wysokosc();
    float get_szerokosc();
 
    virtual void wyswietl()=0;
    virtual void wczytaj()=0;
    virtual ~ksiazka();
}; 
 
#include "ksiazka.h"
 
void ksiazka::set_tytul(string tytul)
{
    tytul=tytul;
}
 
void ksiazka::set_autor(string autor)
{
    autor=autor;
}
 
void ksiazka::set_gatunek(string gatunek)
{
    gatunek=gatunek;
}
 
void ksiazka::set_okladka(string okladka)
{
    okladka=okladka;
}
 
void ksiazka::set_wydawnictwo(string wydawnictwo)
{
    wydawnictwo=wydawnictwo;
}
 
void ksiazka::set_rok_wyd(int rok_wyd)
{
    rok_wyd=rok_wyd;
}
 
void ksiazka::set_cena(float cena)
{
    cena=cena;
}
 
void ksiazka::set_dlugosc(float dlugosc)
{
    dlugosc=dlugosc;
}
 
void ksiazka::set_wysokosc(float wysokosc)
{
    wysokosc=wysokosc;
}
 
void ksiazka::set_szerokosc(float szerokosc)
{
    szerokosc=szerokosc;
}
 
 
 
string ksiazka::get_tytul()
{
    return tytul;
}
 
string ksiazka::get_autor()
{
    return autor;
}
 
string ksiazka::get_gatunek()
{
    return gatunek;
}
 
string ksiazka::get_okladka()
{
    return okladka;
}
 
string ksiazka::get_wydawnictwo()
{
    return wydawnictwo;
}
 
int ksiazka::get_rok_wyd()
{
    return rok_wyd;
}
 
float ksiazka::get_cena()
{
    return cena;
}
 
float ksiazka::get_dlugosc()
{
    return dlugosc;
}
 
float ksiazka::get_wysokosc()
{
    return wysokosc;
}
 
float ksiazka::get_szerokosc()
{
    return szerokosc;
}
 
 
 
ksiazka::~ksiazka()
{
 
} 

Wpisze tylko jedną z 4 klas które dziedziczą, nie ma sensu wszystkich, każda wygląda praktycznie tak samo

 
 #pragma once
 
#include "ksiazka.h"
#include <string.h>
#include <iostream>
 
using namespace std;
 
class ksiazkafan :public ksiazka
{
 
    public:
 
        void wyswietl();
        void wczytaj();
        ksiazkafan();
        ksiazkafan(string, string, string, string, string, int, float, float, float, float);
 
        ~ksiazkafan();
 
};
#include "ksiazkafan.h"
 
void ksiazkafan::wyswietl()
{
    cout<<tytul<<", "<<autor<<endl;
    cout<<"gatunek: "<<gatunek<<", "<<"okladka: "<<okladka<<endl;
    cout<<wydawnictwo<<", "<<rok_wyd<<endl;
    cout<<"cena :"<<cena<<endl;
    cout<<"wymiary ksiazki :"<<dlugosc<<"x"<<wysokosc<<"x"<<szerokosc<<endl;
}
 
void ksiazkafan::wczytaj()
{
    cout<<"Podaj tytul"<<endl;
    cin>>tytul;
    cout<<"Podat autora"<<endl;
    cin>>autor;
    cout<<"Podaj gatunek"<<endl;
    cin>>gatunek;
    cout<<"Twardosc okladki? :"<<endl;
    cin>>okladka;
    cout<<"Podaj wydawnictwo"<<endl;
    cin>>wydawnictwo;
    cout<<"Podaj rok wydania"<<endl;
    cin>>rok_wyd;
    cout<<"Ile kosztuje? :"<<endl;
    cin>>cena;
    cout<<"Podaj wymiary ksiazki (dlugosc x wysokosc x szerokosc)"<<endl;
    cin>>dlugosc>>wysokosc>>szerokosc;
}
 
ksiazkafan::ksiazkafan(string t, string a, string g, string o, string w, int r, float c, float x, float y, float z)
{
    tytul=t;
    autor=a;
    gatunek=g;
    okladka=o;
    wydawnictwo=w;
    rok_wyd=r;
    cena=c;
    dlugosc=x;
    wysokosc=y;
    szerokosc=z;
 
}
 
ksiazkafan::ksiazkafan()
{
    tytul="Wiedzmin";
    autor="A. Sapkowski";
    gatunek="fantasy";
    okladka="miekka";
    wydawnictwo="Fantastyka Polska";
    rok_wyd=1995;
    cena=49.99;
    dlugosc=6;
    wysokosc=16;
    szerokosc=3.5;
}
 
ksiazkafan::~ksiazkafan()
{
 
} 

No i main

 
 #include <iostream>
#include <string.h>
#include "ksiazkafan.h"
#include "ksiazkahis.h"
#include "ksiazkakr.h"
#include "ksiazkaprzyg.h"
#include <vector>
#include <conio.h>
#include <cstdlib>
 
 
using namespace std;
 
int main()
{
 
    ksiazka *wsk;
    int i;
    int n;
    int j;
    int k;
 
    ksiazkafan tab1[25];
    for(i=0;i<25;i++)
    {
        wsk=&tab1[i];
        wsk->wyswietl();
    }
 
    ksiazkahis tab2[25];
    for(n=0;n<25;n++)
    {
        wsk=&tab2[n];
        wsk->wyswietl();
    }
 
    ksiazkakr tab3[25];
    for(j=0;j<25;j++)
    {
        wsk=&tab3[j];
        wsk->wyswietl();
    }
 
    ksiazkaprzyg tab4[25];
    for(k=0;k<25;k++)
    {
        wsk=&tab4[k];
        wsk->wyswietl();
    }
 
 
vector <ksiazkafan> wektor1;
for(int i=0;i<25;i++)
{
    wektor1.push_back(tab1[i]);
 
}
 
vector <ksiazkahis> wektor2;
for(int n=0;n<25;n++)
{
    wektor2.push_back(tab2[n]);
 
}
 
vector <ksiazkakr> wektor3;
for(int j=0;j<25;j++)
{
    wektor3.push_back(tab3[j]);
 
}
 
vector <ksiazkaprzyg> wektor4;
for(int k=0;k<25;k++)
{
    wektor4.push_back(tab4[k]);
 
}
 
int a;
int b;
int c;
int d;
string wyszukiwanie;
 
cout<<"Wybierz gatunek ktory chcesz zobaczyc (fantasy, kryminal, przygodowa, historyczna)"<<endl;
cin>>wyszukiwanie;
 
if(wyszukiwanie=="fantasy")
{
    cout<<"wybierz numer pozycji"<<endl;
    cin>>a;
    wsk=&tab1[a];
    wsk->wyswietl();
}
else if(wyszukiwanie=="kryminal")
{
    cout<<"wybierz numer pozycji"<<endl;
    cin>>b;
    wsk=&tab3[b];
    wsk->wyswietl();
}
else if(wyszukiwanie=="przygodowa")
{
    cout<<"wybierz numer pozycji"<<endl;
    cin>>c;
    wsk=&tab4[c];
    wsk->wyswietl();
}
else if(wyszukiwanie=="historyczna")
{
    cout<<"wybierz numer pozycji"<<endl;
    cin>>d;
    wsk=&tab2[d];
    wsk->wyswietl();
}
else if(wyszukiwanie!="fantasy"||wyszukiwanie!="kryminal"||wyszukiwanie!="przygodowa"||wyszukiwanie!="historyczna")
    cout<<"brak danych"<<endl;
 
string gatunek2;
string decyzja;
 
cout<<"Czy chcesz dodac nowe pozycje do bazy danych? (tak lub nie)"<<endl;
cin>>decyzja;
 
if(decyzja=="tak"||decyzja=="TAK"||decyzja=="Tak")
{
    cout<<"Wybierz gatunek"<<endl;
    cin>>gatunek2;
 
    if(gatunek2=="fantasy")
    {
        ksiazkafan kf1;
        wsk=&kf1;
        wsk->wczytaj();
        wektor1.push_back(kf1);
    }
 
    if(gatunek2=="kryminal")
    {
        ksiazkakr kr1;
        wsk=&kr1;
        wsk->wczytaj();
        wektor3.push_back(kr1);
    }
 
    if(gatunek2=="historyczna")
    {
        ksiazkahis kh1;
        wsk=&kh1;
        wsk->wczytaj();
        wektor2.push_back(kh1);
    }
 
    if(gatunek2=="przygodowa")
    {
        ksiazkaprzyg kp1;
        wsk->&kp1;
        wsk->wczytaj();
        wektor4.push_back(kp1);
    }
 
}
else exit(0);
 
 
 
 
}

Problem jest w tym, że kiedy chcę skompilować to wyskakuje mi:
undefined reference to ksiazkafan::ksiazkafan()'
undefined reference to ksiazkahis::ksiazkahis()'
undefined reference to ksiazkakr::ksiazkakr()'
undefined reference to ksiazkaprzyg::ksiazkaprzyg()'
undefined reference to ksiazkafan::ksiazkafan()'
undefined reference to ksiazkafan::~ksiazkafan()'
undefined reference to ksiazkafan::~ksiazkafan()'
undefined reference to ksiazkakr::ksiazkakr()'
undefined reference to ksiazkakr::~ksiazkakr()'
undefined reference to ksiazkakr::~ksiazkakr()'
undefined reference to ksiazkahis::ksiazkahis()'
undefined reference to ksiazkahis::~ksiazkahis()'
undefined reference to ksiazkahis::~ksiazkahis()'
undefined reference to vtable for ksiazka'
undefined reference to vtable for ksiazkafan'
undefined reference to ksiazkafan::~ksiazkafan()'
undefined reference to ksiazkafan::~ksiazkafan()'
undefined reference to vtable for ksiazkahis'
undefined reference to ksiazkahis::~ksiazkahis()'
undefined reference to ksiazkahis::~ksiazkahis()'
undefined reference to vtable for ksiazkakr'
undefined reference to ksiazkakr::~ksiazkakr()'
undefined reference to ksiazkakr::~ksiazkakr()'
undefined reference to vtable for ksiazkaprzyg'
undefined reference to ksiazkaprzyg::~ksiazkaprzyg()'
undefined reference to ksiazkaprzyg::~ksiazkaprzyg()'
(no to skopiowane, odnośnie wszystkich klas)

Nie wiem co z tym zrobić, jestem początkujący, odkryłem że to najprawdopodobniej w pętlach tworzących obiekty, mógłbym robić je ręcznie, ale bez przesady, jest ich ze 100

Odnośnie tego co napisał kolega w poprzednim wątku, "zakreskowałem" jeden z konstruktorów tak, żeby pozostał tylko domyślny i dalej nic. Nie wiem jeśli ktoś ma chęci to może krok po kroku napisać jak rozwiązać ten problem bo ja troszkę zielonkawy jestem.

Liczę na każdą pomoc :)

0

To wygląda tak jakbyś nie dodał plików *.cpp do projektu

0

po co robisz get i set skoro nie używasz tego?

0

Robię get i set ponieważ moja nauczycielka to chce, nawet jeśli ich nie używam to są one tam "jeśli ktoś kiedyś może chciałby coś z nimi zrobić". Dla mnie też to wyglądało jakbym nie dodał plików ale wszystko jest

0

Stworzyłem pliki, które podałeś i stworzyłem nowy projekt i mi wszystko działa.

Jakiego IDE używasz? Zrób screena jak projekt wygląda z poziomu IDE. Lub jeżeli na linuxie jesteś to jakiegoś makefile wklej czy tam jak to kompilujesz

0

Jak ci prowadząca przyjmie ten kod to się zdziwię. Zmień z protected na private. Klasy bym pisał z dużej litery bo taka praktyka. I używaj get i set, przydadzą się jak zastosujesz się do pierwszego polecenia.

0

Programuje w falconie, ale próbowałem odpalić to również w code blocks
Nie wydaje mi się że wpływ na działanie programu ma to że nie napisałem klas z dużych liter, protected używam bo wydaje mi się bardziej sensowne od private. Co do geterów i seterów to po prostu nie widzę zastosowania w bazie danych, zrobiłem je tylko po to bo "ktoś chciał", więc niech już będą, w końcu nie zawadzają. Nie używałem linuxa (nie było takiego wymogu, przynajmniej jak na razie)

Co śmieszniejsze i w sumie trochę irytujące, jednemu z moich kolegów również udało się to odpalić, wysłałem to później kilku innym i dupa, tak samo jak u mnie

0

nie mowilem, że wpływa. Mówię byś to zmienil bo razi. Jak ja w robocie potem musze taki kod poprawiać to dzięki bardzo. Podaj mi swój argument dlaczego protected jest sensowniejsze.
"Undefined reference " To są błędy linkera więc, stwórz nowy projekt i po kolei wszystko dodaj. Jak jeszcze @Styku mówi ze u niego działa.

Edit. W projekcie masz tylko main.cpp

0

Dodałem tylko jedno zdjęcie żeby jako tako pokazać jak to wygląda, oczywiście mogę dodać zdjęcia wszystkich 11 plików, ale na każdym będzie to samo co tutaj tylko że w falconowskiej oprawie

Spróbuje to przepisać, może jakoś zadziała

No cóż, jednak nie zadziałało

0

Ja nie wiem jak dokładnie działa ten falcon, ale musisz dodać resztę plików do projektu. Na screenie widać ze masz w projekcie tylko main.

0

Ale pliki są dodane, może na screenie tego dokładnie nie widać, inaczej wyskakiwałaby masa innych błędów

0

Najlepiej spakuj i wrzuć tutaj cały projekt.

0

Proszę

1

robienie get i set bo tak mija sie z celem. Powaznie
Jezeli Twoja nauczycielka powie "bo to jest po to by byla hermetyzacja/enkapsulacja" to powinienes sie klocic (oczywiscie jezeli potrafisz). Bo to zadna hermetyzacja.
bo i tak dajesz implementacje na zewnatrz. Kazdy uzytkownik tej klasy moze sobie wziac zmienna zmienic i ustawic... rownie dobrze te pola moga byc publiczne. To nie jest hermetyzacja

Jest jeszcze jeden argument ktory jest poprawny, ale nie w tym przypadku
"piszac funkcje pozniej jezeli implementacja sie zmieni dopisze sie tylko do funkcji i tyle, nie bedzie trzeba zmieniac nic w kodzie"
a co jesli typ zwracany sie kompletnie zmieni? To wtedy bedzie trzeba zmieniac tak samo jak w przypadku zmiennej... , ale nie o tym. Zgadzam sie z tym powyzszym, ale nie z tym wypadku

zeby byla hermetyzacja powinien byc konstruktor ktory ustawia tytul, autora itd a te pola nie powinny miec zadnych setterow ani getterow. Tytul ksiazki rzadko sie zmienia, wydawnictwo takze rzadko. Bo co najwyzej jest dodawany nowy ale nie zmieniany (pewnie pare razy w historii sie zdarzylo ze trzebabylo zmieniac okladke a stara nigdy nie zostala wydana...). Do wyswietlania ksiazki powinien byc przeladowany operator <<< dla ostream i on sobie wypisuje dane na konsoli i tyle. Wiecej nic ta klasa nie musi robic.
Malo tego ksiazka nie powinna miec ceny to powinno byc w innej klasie.

Jak ksiazka moze decydowac o tym ile kosztuje? (no bo obiekt to ksiazka tak? Widziales zeby ksiazka mowila "a dzis to podwoje sobie cene bo jest poczatek tygodnia"? No wlasnie ja tez nie)

Cena powinna byc w jakims Magazynie gdzie jest prosta mapa. Jako klucz powinna byc ksiazka a jako value cena (jeden z wielu przykladow, ten po prostu jest pierwszym ktory wpadl mi do glowy)

baa te pola ksiazki (string,string,string, float, float ....) zrobilbym jako strukture i w ksiazce posiadalbym ta strukture i nic wiecej... przekazywanie 10 parametrow nie jest fajne, lepiej jeden ktory robi za 10. Jezeli chce sie wczytac z konosli to mozna przeladowac operator >> i tez chowa sie implementacja jak to sie tworzy obiekt

0

@fasadin mnie się widzi, że on źle podszedł do zadania. To wygląda na biblioteka/księgarnia projekt na zaliczenie. Nie mów mi, że kiedy zaraz sesja, nie robiliście hermetyzacji, kiedy to pierwszy temat bodaj w obiektowości. Zrobił po swojemu, a powinien własnie "zamknąć" klasę. I zrobić w miarę porządny system.

Miałem pisać o cenie,autorze i że klasa książki strasznie duża.

0

Nie no rozumiem, że projekt jest dziurawy jak ser, możliwe, że do części z tego sam nawet bym doszedł gdybym tylko mógł to skompilować i zobaczyć jak to dziadostwo działa. Program został zaliczony(no bardziej sam kod, ale mniejsza z tym), temat napisałem bo chcę wiedzieć dlaczego się nie chciał odpalić, albo inaczej, dlaczego niektórym się opala a mi np. nie chce

A i klasa ksiazka jest duża bo taki był wymóg, i tak jest mniejsza niż powinna bo już nie miałem pomysłów co jeszcze tam wpakować

0

Nie kompiluje Ci się bo Ty nie dodajesz plikót *.cpp do projektu tylko je otwierasz w IDE. W projekcie ich nie ma. Nie są brane pod uwagę przy kompilacji i dla tego te błędy występują. Znajdź w tym IDE gdzie możesz dodać plik do projektu i je dodaj.

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