» »

C++ problem: težava z hirerarhijo razreda

C++ problem: težava z hirerarhijo razreda

BigRedOne ::

Dober dan, večer, jutro!
Sem začetnik v programiranju v c++ in imam majhno težavico. Učim se s knjigo Francisa Glassborowa C++ od začetka in sem pri poglavju, ki obravnava hirerarhijo razedov (12. poglavje, če ima kdo knjigo). Uporabljam prevajalnik MinGW Development Studio. Problem ->

"glavni razred"
class basic_chesspiece { // glavni razred za igranje šaha
public:
struct position{
unsigned char rank;
unsigned char file;
}
static position const off_board; // mimogrede, mi lahko kdo natanko razloži kaj pomeni
// static
virtual bool move(position const&);
position where() const;
bool is_white() const;
explicit basic_chesspiece(bool white = true, bool castle = false);
explicit basic_chesspiece(position const &, bool white = true,
bool castle = false);
virtual ~basic_chesspiece();
private:
bool const white_;
position location_;
bool can_castle;
// onemogočimo kopiranje
basic_chesspiece (basic_chesspiece const &);
basic_chesspiece & operator = (basic_chesspiece const &);
}

No, to je bila koda za razred, prosim sporočte mi, če je potrebna še koda za funkcije in kostruktorja in destruktorja.

ZDEJ pa problem!!!
Na vrsti je "podrazred"

class knight: public basic_chesspiece {
public:
virtual bool move (position const &);
explicit knight (bool white = true);
explicit knight (position const &, bool white = true);
virtual ~knight();
private:
};

Do sem se mi vse lepo prevede....
A tukaj se začno težave ->
Če implementiram destruktorje (in tudi funkcije) mi prevajalnik "vrže ven errorje".
Za spodnje tri implementacije mi jih vrže kar 6!!!

knight::knight (bool white): basic_chesspiece (white) {}
knight::knight (position const & pos, bool white):
basic_chesspiece(pos, white){}
knight::~knight(){}
Errorji:

Program Files\MinGWStudio\exercises\Poglavje 12\Poglavje14_chess\Debug\chess.o(.text+0x57f): In function `ZN6knightC1Eb':
D:\Program Files\MinGWStudio\exercises\Poglavje 12\Poglavje14_chess\chess.cpp:28: undefined reference to `vtable for knight'
D:\Program Files\MinGWStudio\exercises\Poglavje 12\Poglavje14_chess\Debug\chess.o(.text+0x659): In function `ZN6knightC2ERKN16basic_chesspiece8positionEb':
D:\Program Files\MinGWStudio\exercises\Poglavje 12\Poglavje14_chess\chess.cpp:32: undefined reference to `vtable for knight'
D:\Program Files\MinGWStudio\exercises\Poglavje 12\Poglavje14_chess\Debug\chess.o(.text+0x729): In function `ZN6knightC1ERKN16basic_chesspiece8positionEb':
D:\Program Files\MinGWStudio\exercises\Poglavje 12\Poglavje14_chess\chess.cpp:32: undefined reference to `vtable for knight'
D:\Program Files\MinGWStudio\exercises\Poglavje 12\Poglavje14_chess\Debug\chess.o(.text+0x7d4): In function `ZN6knightD2Ev':
D:\Program Files\MinGWStudio\exercises\Poglavje 12\Poglavje14_chess\chess.cpp:35: undefined reference to `vtable for knight'
D:\Program Files\MinGWStudio\exercises\Poglavje 12\Poglavje14_chess\Debug\chess.o(.text+0x896):D:\Program Files\MinGWStudio\exercises\Poglavje 12\Poglavje14_chess\chess.cpp:35: more undefined references to `vtable for knight' follow

Poglavje14_chess.exe - 6 error(s), 0 warning(s)

Lahko da je tudi moj prevajalnik kriv, prosim, da mi tisti ki lahko in ki znate, pomagate!!

Hvala
BigRedOne

Tutankhamun ::

Manjkata ti 2 podpičja.
Eden na koncu strukture, drugi na koncu razreda basic_chesspiece. Sem označil v kodi spodaj! Malo sem sam funkcije premetov, da je MENI bolj ušeč. Ker sm tko navajen, da so konstruktorji zgoraj pol pa use ostalo :P
class basic_chesspiece
{
private:
	// onemogočimo kopiranje
	basic_chesspiece (basic_chesspiece const &);
	basic_chesspiece & operator = (basic_chesspiece const &);

public:
        explicit basic_chesspiece(bool white = true, bool castle = false);
	explicit basic_chesspiece(position const &, bool white = true, bool castle = false);
	virtual ~basic_chesspiece();


	struct position
	{
		unsigned char rank;
		unsigned char file;
	};// manjka ti podpicje

	static position const off_board;
	virtual bool move(position const&);
	position where() const;
	bool is_white() const;
	
private:
	bool const white_;
	position location_;
	bool can_castle;

};// manjka ti podpicje


Tista vrstica
static position const off_board;
, pa pomeni točn to kar si hotu narest :P.
Uglavnem spremenljivka je statična tipa position, z imenom off_board. Je pa to konstanta!

Ne vem pa kok stvari poznaš, ampak funkcije moreš tudi implementirat (dat eno kodo pod njih). Če maš pol ok :P.

PS.
Pa za vpisovanje c++ kode v forumu uporablj tag st.koda! Lahko tudi pritisneš na gumbek v orodni vrstici. Gumbek se nahaja zraven narekovajev (za citiranje), na njem je modra "značka". Najprej 1x pritisneš, se ti pojavi v oknu st.koda v oklepajih. Potem prilepi svojo kodo in še enkrat pritisni na gumbek, da se ti značka zaključi... Da je laži gledat kodo, da so zamiki pa mal pobarvan...
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

PaX_MaN ::

da so zamiki pa mal pobarvan...

Pofarban? Od kdaj?

Tutankhamun ::

moja napaka, učasih so bli. No usaj odebeljen je blo. Zdej pa očitno tega ni več :). Ene prakrta sm jih js pofarbu ročno, pa mi je moderator use zbrisu, pol pa nism več tega delu :)
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

BigRedOne ::

Tutankhamun

Veš, nisem tako neumen da bi pozabu implementirat kodo, sem napisu da lahko je dodatno napišem ;) (ja len sem)
kar se tiče ; sem pač hitel
tuki je celotna koda:

# include <>iostream>
# include <stdexcept>

class basic_chesspiece {
public:
	struct position{
		unsigned char file;
		unsigned char rank;
		position const & is_valid()const;
	};
	static position const off_board;
	virtual bool move (position const &);
	position where() const;
    bool is_white ()const;
	explicit basic_chesspiece (bool white = true, bool castle = false);
	explicit basic_chesspiece (position const &, bool white = true, bool castle = false);
	virtual ~basic_chesspiece();
private:
	bool const white_;
	bool can_castle;
	position location_;
	basic_chesspiece(basic_chesspiece const &);
	basic_chesspiece & operator = (basic_chesspiece const &);
	position const & is_valid_position(position);
};



class knight: public basic_chesspiece {
public:
	virtual bool move (position const &);
	explicit knight  (bool white = true);
	explicit knight (position const &, bool white = true);
	virtual ~knight();
private:
};

// še implementacije 
# include <iostream>
# include "chess.h"
bool basic_chesspiece::move(position const & loc){
	location_ = is_valid_position(loc);
	return true;
}
basic_chesspiece::position basic_chesspiece::where ()const{
	return location_;
}
bool basic_chesspiece::is_white()const {return white_;}
basic_chesspiece::basic_chesspiece (bool white, bool castle) : white_(white), can_castle(castle), location_(off_board){}
basic_chesspiece::basic_chesspiece(position const & location, bool white, bool castle) : white_(white), can_castle(castle), 
location_(is_valid_position(location)){}
basic_chesspiece::~basic_chesspiece(){}
basic_chesspiece::position const basic_chesspiece::off_board = {9, 9};

basic_chesspiece::position const & basic_chesspiece::is_valid_position(position location){
	return location.is_valid();
}

basic_chesspiece::position const & basic_chesspiece::position::is_valid()const{
	if((rank == off_board.rank) and (file == off_board.file)) return *this;
	if (file > 7) throw std::out_of_range("Invalid file");
	if (rank > 7) throw std::out_of_range("Invalid rank");
	return *this;
}

 knight::knight (bool white): basic_chesspiece (white) {
	 std::cout << "Blablabla\n";
 }
knight::knight (position const & pos, bool white):
 basic_chesspiece(pos, white){
	 std::cout <<"BlaBlaBla\n";
 }
 knight::~knight(){
	 std::cout << "blablabla\n";
 }
// in...

# include "chess.h"
# include "implementacije.h"
# include <iostream>
# include <ostream>

int main() {
	try{
		basic_chesspiece bc;
		basic_chesspiece::position pos;
		knight asdd;
		pos = bc.where();
		std::cout << "The piece is on row " <<static_cast<int>(pos.rank) << ", file " << static_cast<int>(pos.file) << ". \n";
		bc.move(pos);
std::cout << "The piece is ";
if(bc.is_white()) std::cout <<"white";
else std::cout << "black";
std::cout << ".\n";
	}
	catch(...){
		std::cerr << "Caught an exception\n";
	}
} 

Zgodovina sprememb…

BigRedOne ::

Tutankhamon se vid da si sam preletel kar sem napisu....

BigRedOne ::

sploh pa a lahko kdo odgovori kaj pomenijo tile errorji...

Tutankhamun ::

Pa res sm prehit preletu :P. Ampak podpičja so ti pa manjkala kokr kol obrneš. Bom še to zdej pregledu :P
AMD Phenom QUAD 9950 Black Edition, 8GB

Tutankhamun ::

1.
if((rank == off_board.rank) and (file == off_board.file)) return *this;

Kaj je ta besedica and? Vrjetn si hotu && napisat.


2.
# include <>iostream>

Kaj je to?


3.
virtual bool move (position const &);

To imaš definirano v razredu knight. Kje imaš implementacijo?

Ko boš te 3 točke razrešu se ti bo prevedl prej pa ne. Js sm samo zakomentiru funkcijo iz 3. točke, poleg tega da sm še popravu prvi dve.
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

ERGY ::

sploh pa a lahko kdo odgovori kaj pomenijo tile errorji...



Lej glede na kodo, ki si prilimov gori je en miljon errorjev. Dej uplowdaj na kak pejđ pa link vrži. Že include maš narobe.

BigRedOne ::

Sem ugotovu da me prevajalnik zaj*****

sicer pa sledijo odgovori na vprašanja Tutankhamon
1. ja and ali && je enako (in legalno v C++, vsaj novejšem)
2. sem se zatipku pri prepisovanju, v kodi je pravilno
3. mislim da to ni več potrebno

sicer pa hvala za pomoč čeprav ste se bolj spotikal ob moje napake pri prepisovanju kot pa "resne" napake v kodi
bigredone

Templater ::

1.
if((rank == off_board.rank) and (file == off_board.file)) return *this;

Kaj je ta besedica and? Vrjetn si hotu && napisat.


Se je prav napisu... kot je že rekel...
BigRedOne, drugič ti kode ni treba kr prapisovat.. lahk uporabiš copy??:P


LP
Ubi bene ibi Patria

BigRedOne ::

sej sem uporabil copy pa tud paste! potem mi je spletna stran povedala da < ne smem uporabt (zarad HTML kode) pol sem šu neki spreminjat in pol sem porajtu da lahk upurabm tisti gub "za kodo pisat"... in tako je prišlo do napake :) u bistvu več napak :P

Zgodovina sprememb…

Tutankhamun ::

???? A se da dobit kje kšno internet stran kjer piše, da se lahko uporab tut "and" namesto "&&" v C++. Moj prevajalnik tega 100% ne zna prevest. Mam pa VS 2008. Tega res nikol nism vidu, edin v Basicu :P.

Od kje nj pa mi vemo, da si se zatipku? Pač si narobe napisu, js sm vrgu pr seb skos prevajalnik in najdu napake...
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

fiction ::

ISO/IEC 14882:1998(E) C++ standard omenja alternativen nacin zapisa && kot and, || kot or, & kot bitand in tako naprej. Ce tvoj prevajalnik tega ne pozna, potem je to njegov problem. Zgleda da enostavno ne uposteva novejsega standarda iz leta 1998. Se GCC 2.95.3 pozna te zadeve.

Za MS C++ prevajalnik je ocitno treba includati iso646.h, kar je grd hack, ki naredi nekaj v stilu "#define and &&". Vse skupaj je se vedno mimo standarda, ker bi "and" kot keyword moral poznati ze sam prevajalnik (brez da ti karkoli caras).

Zgodovina sprememb…

  • spremenil: fiction ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[c++]Seznam

Oddelek: Programiranje
142658 (2658) Gundolf
»

[C++] Linker error

Oddelek: Programiranje
51286 (1286) Quikee
»

[C] MySQL

Oddelek: Programiranje
292812 (1834) Tutankhamun
»

[C++] Portabilna funkcija za kopiranje datotek

Oddelek: Programiranje
172248 (1904) Gundolf
»

Casovni problem v C/C++

Oddelek: Programiranje
91255 (1156) sid_dabster

Več podobnih tem