[C++] DevC++ Linker Error, problem z nagłówkami - tak sądze

0

Czesc

Znudzily mnie juz male projekty C++ wiec zabralem sie za wieksze. Wiekszym projektom powinno

towarzyszyc podzielenie ich na osobne headery. Tak tez zrobilem. Wszystkie headery przy

kompilowaniu nie wyrzucaja zadnego bledu, lecz gdy tylko sprobuje skompliowac caly projekt

Linker zaczyna piszczec:

<a target='_blank' title='ImageShack - Image And Video Hosting'

href='http://img337.imageshack.us/i/linkererror.png/'><img

src='http://img337.imageshack.us/img337/4872/linkererror.png' border='0'/></a>

Uzywam DevC++.

Ponizej zamieszczam pomocniczy schemat jak sa inkludowane pliczki w moim projekcie:

<a target='_blank' title='ImageShack - Image And Video Hosting'

href='http://img80.imageshack.us/i/schemata.png/'><img

src='http://img80.imageshack.us/img80/3443/schemata.png' border='0'/></a>

Klasa CCharacter jest klasa abstrakcyjna a klasa CPlayer z niej dziedziczy.
Do klasy CMap musialem dodac header CPlayer.h poniewaz uzywam tam wskaznikow do klasy CPlayer.

(Czy to poprawne?)

W koncu moj nieszczesny kod:
main.cpp

#include "PCH.h" // zbior potrzebnych naglowkow kompilatora 

#include "cplayer.h"
#include "cmap.h"

using namespace std;

char tab[MAPA_SZER][MAPA_WYS]; // game map

// POINTERS
/* Here we create required pointers for rest of functions */
CPlayer* pPlayer = new CPlayer; // pointer for class cplayer
CMap* pMap = new CMap; // pointer for class cmap

// INITIALIZATION
void onInit()
{
	// MAP
	/* we call Rysuj() function to draw the map. */
	pMap->Rysuj();
	
	// PLAYER
	/* Then we asking player how he would like to name his character
	We use SetName() function to save it. */
	
	string name;
	cout<<"Enter name for your character"<<endl;
	cin>>name;
	pPlayer->SetName(name);
	
}

// ACTION LOOP
void onLoop()
{
	char cKey = _getch();
	pPlayer->Move(cKey);
}

// RENDERING LOOP
void onRender()
{
	pMap->Rysuj();
}

// CLEANING LOOP :)
void onCleanUp() 
{
	delete pPlayer;
	delete pMap;
}
// --------------------------------------- //

main()
{
	onInit();

	// GAME LOOP
	do
	{
		onLoop();
		onRender();
	} while((pPlayer->m_px!=0) && (pPlayer->m_py!=0));

	onCleanUp();
	system("PAUSE");
	//
}

cplayer.h + cplayer.cpp


// FILE CPLAYER.H
#ifndef cplayerH
#define cplayerH

#include "ccharacter.h"
#include "PCH.h"

// --------------------------- CPLAYER -------------------------------- //

class CPlayer : public CCharacter
{
	public:
		// METHODS
		void SetName(string name);
		void Look();
		void SetStatus();
		void Move(char cKey);		
};

#endif



// FILE CPLAYER.CPP
#include "cplayer.h"

//-------------------------------------------------------------------- 
void CPlayer::SetName(string name)
{
	m_name = name;	
}
// ------------------------------------------------------------------- 
void CPlayer::Look()
{
	for(int i = m_px-5; i < (m_px-5)+11; i++)
	{
		for(int j = m_py-5; j < (m_py-5)+11; j++)
		{
			if(tab[i][j] == 'b')
			{
				m_status = WAITING;
			}			
		}
	}		
}
// ------------------------------------------------------------------- 
void CPlayer::SetStatus() // do dopracowania - zeby przy kazdym ruchu nie pytalo o walke
{
	string strFight;
    if(m_status == WAITING)
	{
		cout<<"Do you want to start fight? (Y/N)";
		cin>>strFight;
		while(strFight != "Y" || strFight != "N")
		{
			cout<<"Wrong input!"<<endl;
			cout<<"Do you want to start fight? (Y/N)"<<endl;
			cin>>strFight;	
		}
		strFight == "Y" ? m_status = COMBAT : m_status = NON_COMBAT;			

	
	}             
}
// ------------------------------------------------------------------- 
void CPlayer::Move(char cKey)
{

	if(cKey == 'w' && (tab[m_px-1][m_py] == ' ')) m_px--;
	if(cKey == 's') m_px++;
	if(cKey == 'a') m_py--;
	if(cKey == 'd') m_py++;
	cout<<m_px<<", "<<m_py<<"     ";
}
// ------------------------------------------------------------------- 

ccharacter.h+ccharacter.cpp

// Plik nagłówkowy ccharacter.h
// -------------------------------------------------------
#ifndef ccharacterH
#define ccharacterH
// -------------------------------------------------------

#include "PCH.h"

using namespace std;
extern char tab[MAPA_SZER][MAPA_WYS];

// ALL DEFINITIONS OF METHODS ARE INCLUDED IN CHARACTER.CPP FILE!
// --------------------------CCharacter------------------------------- //
// CHARACTER CLASS
class CCharacter
{	
public:
    // enum STATUS defines const variables for combat status: COMBAT = 1 means character is in combat; 
	// NON_COMBAT means character is out of combat; WAITING means character is waiting for user decision (will be deleted l8r)
    enum STATUS
    {
         COMBAT = 1, NON_COMBAT = 0, WAITING = -1 
    };
    
    int m_px; // COORD X
	int m_py; // COORD Y
	char m_psymbol; // CHARACTERS SYMBOL ON THE MAP
	string m_name; // CHARACTER'S NAME
	STATUS m_status; // DEFAULT STATUS IS OUT OF COMBAT
	
	// STATISTICS OF CHARACTER
	float m_health;
	float m_armor;
    float m_dexterity;
    float m_strenght;
    float m_respect;
	
	// CONTRUCTOR
	CCharacter();

	// METHODS
	virtual void SetName(string name) = 0;
	virtual void Look() = 0;
	virtual void SetStatus() = 0;
	virtual void Move() = 0;
};
// ---------------------------------------------------------------------//
#endif


// PLIK CCHARACTER.CPP
#include "ccharacter.h"

// ------------------------------------------------------------------- 
CCharacter::CCharacter()
{
	m_px = 20;
	m_py = 20;
	m_psymbol = 'o';
	m_name = "Character";
	m_status = NON_COMBAT;	
	
	m_health = 1000.00;
	m_strenght = 10.00;	
}

cmap.h+cmap.cpp


// ------- CMAP.H FILE ----------
#ifndef cmapH
#define cmapH

#include "PCH.h"
	
	extern char tab[MAPA_SZER][MAPA_WYS];
	using namespace std;
	
// ------------------------------CMAP--------------------------------- //
// MAP CLASS
class CMap
{
private:
	// WIDTH AND HEIGHT
	int m_width;
	int m_height;
public:
	// CONTRUCTOR
	CMap();

	// METHOD DRAWING MAP
	void Rysuj();

	// ACCESS METHOD
	int ShowWidth();
	int ShowHeight();
};
	
#endif


// ----- CMAP.CPP FILE -------
#include "cmap.h"
#include "cplayer.h"
// -------------------------------------------------------
// CONTRUCTOR
CMap::CMap()
{
	m_width = MAPA_SZER;
	m_height = MAPA_WYS;	
}
// -------------------------------------------------------
// METHOD RYSUJ()
void CMap::Rysuj()
	{
	gotoxy(0,0);
	cout<<"Witamy w Bug City Project "<<WERSJA<<endl;
	int width = ShowWidth(); 
	int height = ShowHeight();
	int k = 1;
	CPlayer* pPlayerToMap = new CPlayer;
	for (int x=0; x < width; x++) 
		{
			for (int y=0; y < height; y++) 
			{
				if(x == 0 || x == width-1 || y == 0 || y == height-1) {
					tab[x][y] = '+';
				} else {
					tab[x][y] = ' ';
				} 
				
				tab[pPlayerToMap->m_px][pPlayerToMap->m_py] = pPlayerToMap->m_psymbol;

				cout<<tab[x][y];
			}
		cout<<endl;
		}
	delete pPlayerToMap;
	}
// ------------------------------------------------------------------- //

Z gory moge bardzo przeprosic za ilosc kodu, ale nie chce nic skracac/upraszczac poniewaz nie wiem co tak na prawde powoduje blad linkera. Postaralem sie jakos to tym schemacikiem wam zwizualizowac. Dziekuje za probe pomocy. Jezeli czegos nie rozumiecie prosze spytajcie to wyjasnie.

NB. jezeli po drodze sie Wam jeszcze cos nie spodoba napiszcie tez o tym. cenie kazda uwage, bo na bledach sie ucze :)

Dziekuje z gory jeszcze raz.

0

Dodałeś pliki CPP do projektu?

0

Tak dodałem.

projektd.png

Ehh trzeba bylo z Visuala nie rezygnowac :S

0

No co Ty, zrezygnowałeś z visuala na rzecz Deva? :D

class CCharacter
{      
        ...  
        virtual void Move() = 0;
};


class CPlayer : public CCharacter
{
        ...
        void Move(char cKey);                
};

Brak implementacji metody CCharacter::Move.

0

Dzieki wielkie - dziala ;)

Tak.. z Visuala na DevCrap++ przeszedlem bo pracuje grupowo nad projektem i ludzie sie chyba boja Visuala uzywac bo zbyt duzo opcji ma....

To tak jakby z Photoshopa na Painta przejsc -.-

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