jeudi 17 avril 2014

C++, héritage, virtual - Stack Overflow


I've got some problems here. I' am trying to make my code working like interface in java. This class is being inherited by 2 other by they are causing some problems. And also i'd like to know if i am doing it correctly, the ways to improve my code. I'am novice. Look:


Interface class:


#include <iostream>
#include <string>
class IZarzadzaniePozycjami{

public:
IZarzadzaniePozycjami(void);
~IZarzadzaniePozycjami(void);

public:
virtual void ZnajdzPozycjePoTytule();
virtual void ZnajdzPozycjePoId();
virtual void WypiszWszystkiePozycje();


};

#include "Pozycja.h"
#include "IZarzadzaniePozycjami.h"
#include <iostream>
#include <list>

Catalog class which inherites from IZarzadzanie... Class.


#include "Pozycja.h"
#include "IZarzadzaniePozycjami.h"
#include <iostream>
#include <list>

class Katalog : public IZarzadzaniePozycjami
{
private:
std::string dzialTematyczny;
public:
void ZnajdzPozycjePoTytule(std::string tytul);
void ZnajdzPozycjePoId(int id);
void WypiszWszystkiePozycje();
Katalog(void);
Katalog(std::string dzialTematyczny_);
void DodajPozycje(Pozycja);
std::list<Pozycja> lista;
friend bool operator==(const Katalog & kat, const std::string & s);
~Katalog(void);
};
inline bool operator==(std::string& s, Katalog& katalog)
{
return katalog == s;
}

and then library class(biblioteka.h) which alseo inherite from interface


#include<iostream>
#include "IZarzadzaniePozycjami.h"
#include "Bibliotekarz.h"
#include "Pozycja.h"
#include "Katalog.h"

class Biblioteka :
public IZarzadzaniePozycjami
{
public:
Biblioteka(void);
~Biblioteka(void);
Biblioteka(std::string adres_);
void DodajBibliotekarza(Bibliotekarz);
void WypiszBibliotekarzy();
void DodajKatalog(Katalog);
void DodajPozycje(Pozycja p, std::string dzialTematyczny);

void ZnajdzPozycjePoTytule(std::string tytul);
void ZnajdzPozycjePoId(int id);
void WypiszWszystkiePozycje();
private: std::string adres;



};

And here are some errors. Sorry for long post. Didn't know what to cut off.


c:\users\komputer\documents\visual studio 2012\projects\project1\izarzadzaniepozycjami.h(3): error C2011: 'IZarzadzaniePozycjami' : 'class' type redefinition
1> c:\users\komputer\documents\visual studio 2012\projects\project1\izarzadzaniepozycjami.h(3) : see declaration of 'IZarzadzaniePozycjami'
1>c:\users\komputer\documents\visual studio 2012\projects\project1\katalog.h(7): error C2504: 'IZarzadzaniePozycjami' : base class undefined
1>c:\users\komputer\documents\visual studio 2012\projects\project1\biblioteka.h(9): error C2504: 'IZarzadzaniePozycjami' : base class undefined
1> Generating Code...
1>c:\users\komputer\documents\visual studio 2012\projects\project1\katalog.cpp(16): warning C4717: 'operator==' : recursive on all control paths, function will cause runtime stack overflow



Use #pragma once in all the header files:


#pragma once

#include <iostream>
#include <string>
class IZarzadzaniePozycjami{

public:
IZarzadzaniePozycjami(void);
~IZarzadzaniePozycjami(void);
....

and make sure the header with IZarzadzaniePozycjami is included everywhere before IZarzadzaniePozycjami is used.




You declare


virtual void ZnajdzPozycjePoTytule();

but in your classes you declare (and I hope you define)


void ZnajdzPozycjePoTytule(std::string tytul);

These are not the same methods. A method signature includes its parameters, so your virtual method is still unimplemented.




What you're calling an "Interface" class is not the same as the Java concept. In java an interface has no implementation, but the class you've defined, must have an implementation defined. You can avoid defining the virtual methods if you make them pure virtual (e.g. = 0), but you must provide an implementation for the all non-pure virtual methods of IZarzadzaniePozycjami. In its current form, that means every method must be defined. This is why it won't compile.



I've got some problems here. I' am trying to make my code working like interface in java. This class is being inherited by 2 other by they are causing some problems. And also i'd like to know if i am doing it correctly, the ways to improve my code. I'am novice. Look:


Interface class:


#include <iostream>
#include <string>
class IZarzadzaniePozycjami{

public:
IZarzadzaniePozycjami(void);
~IZarzadzaniePozycjami(void);

public:
virtual void ZnajdzPozycjePoTytule();
virtual void ZnajdzPozycjePoId();
virtual void WypiszWszystkiePozycje();


};

#include "Pozycja.h"
#include "IZarzadzaniePozycjami.h"
#include <iostream>
#include <list>

Catalog class which inherites from IZarzadzanie... Class.


#include "Pozycja.h"
#include "IZarzadzaniePozycjami.h"
#include <iostream>
#include <list>

class Katalog : public IZarzadzaniePozycjami
{
private:
std::string dzialTematyczny;
public:
void ZnajdzPozycjePoTytule(std::string tytul);
void ZnajdzPozycjePoId(int id);
void WypiszWszystkiePozycje();
Katalog(void);
Katalog(std::string dzialTematyczny_);
void DodajPozycje(Pozycja);
std::list<Pozycja> lista;
friend bool operator==(const Katalog & kat, const std::string & s);
~Katalog(void);
};
inline bool operator==(std::string& s, Katalog& katalog)
{
return katalog == s;
}

and then library class(biblioteka.h) which alseo inherite from interface


#include<iostream>
#include "IZarzadzaniePozycjami.h"
#include "Bibliotekarz.h"
#include "Pozycja.h"
#include "Katalog.h"

class Biblioteka :
public IZarzadzaniePozycjami
{
public:
Biblioteka(void);
~Biblioteka(void);
Biblioteka(std::string adres_);
void DodajBibliotekarza(Bibliotekarz);
void WypiszBibliotekarzy();
void DodajKatalog(Katalog);
void DodajPozycje(Pozycja p, std::string dzialTematyczny);

void ZnajdzPozycjePoTytule(std::string tytul);
void ZnajdzPozycjePoId(int id);
void WypiszWszystkiePozycje();
private: std::string adres;



};

And here are some errors. Sorry for long post. Didn't know what to cut off.


c:\users\komputer\documents\visual studio 2012\projects\project1\izarzadzaniepozycjami.h(3): error C2011: 'IZarzadzaniePozycjami' : 'class' type redefinition
1> c:\users\komputer\documents\visual studio 2012\projects\project1\izarzadzaniepozycjami.h(3) : see declaration of 'IZarzadzaniePozycjami'
1>c:\users\komputer\documents\visual studio 2012\projects\project1\katalog.h(7): error C2504: 'IZarzadzaniePozycjami' : base class undefined
1>c:\users\komputer\documents\visual studio 2012\projects\project1\biblioteka.h(9): error C2504: 'IZarzadzaniePozycjami' : base class undefined
1> Generating Code...
1>c:\users\komputer\documents\visual studio 2012\projects\project1\katalog.cpp(16): warning C4717: 'operator==' : recursive on all control paths, function will cause runtime stack overflow


Use #pragma once in all the header files:


#pragma once

#include <iostream>
#include <string>
class IZarzadzaniePozycjami{

public:
IZarzadzaniePozycjami(void);
~IZarzadzaniePozycjami(void);
....

and make sure the header with IZarzadzaniePozycjami is included everywhere before IZarzadzaniePozycjami is used.



You declare


virtual void ZnajdzPozycjePoTytule();

but in your classes you declare (and I hope you define)


void ZnajdzPozycjePoTytule(std::string tytul);

These are not the same methods. A method signature includes its parameters, so your virtual method is still unimplemented.



What you're calling an "Interface" class is not the same as the Java concept. In java an interface has no implementation, but the class you've defined, must have an implementation defined. You can avoid defining the virtual methods if you make them pure virtual (e.g. = 0), but you must provide an implementation for the all non-pure virtual methods of IZarzadzaniePozycjami. In its current form, that means every method must be defined. This is why it won't compile.


0 commentaires:

Enregistrer un commentaire