Sign in to follow this  

Help solving some nasty errors (MSVC++ 2005)

This topic is 3865 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

#include <iostream>
#include <string>
#include <vector>
#include <ctime>
#include <algorithm>

using namespace std;

class Kort
{
 public:
  enum rank {ES = 1, TO, TRE, FIRE, FEM, SEKS, SYV, OTTE, NI, TI, BONDE, DRONNING, KONGE};
  enum kulør {KLØR, RUDER, HJERTER, SPAR};
  
  //overloader << operatoren så jeg kan sende Kort objekter til standard output
  friend ostream& operator<<(ostream& os, const Kort& etKort);
  
  Kort(rank e = ES, kulør s = SPAR, bool VendtOp = true);
  
  //returnere værdien af kort, 1-11 
  int HentVærdi() const;
  
  //vender kortet, hvis kortet vender nedad vendes det om og vice versa
  void Vend();
 
 //slut med public, start af private
 private:
  rank m_Rank;
  kulør m_Kulør;
  bool m_ErVendtOp;
}; //slut på class Kort

//Kort constructor
Kort::Kort(rank r, kulør s, bool VendtOp): m_Rank(r), m_Kulør(s), m_ErVendtOp(VendtOp)
{}

int Kort::HentVærdi() const
{
 int værdi = 0;
 if (m_ErVendtOp)
 {
  //værdien er den vist på kortet
  værdi = m_Rank;
  //værdien er 10 for knægt, dronning og konge
  if (værdi > 10)
   værdi = 10;
 }
return værdi;
}

void Kort::Vend()
{
 m_ErVendtOp = !(m_ErVendtOp);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////HER BEGYNDER 'HÅND KLASSEN'/////////////////////////////////

class Hånd
{ 
 public:
  Hånd();
  
  virtual ~Hånd();
  
  void TilføjKort(Kort* etKort);
  //sletter hele hånden
  void Slet();
    
  int HentTotal() const;
 
 protected: 
  vector<Kort*> m_Kort;
}; //slut på class Hånd

Hånd::Hånd()
{
 m_Kort.reserve(7);
}

Hånd::~Hånd()
{
 Slet();
}

void Hånd::Slet()
{
 vector<Kort*>::iterator iter = m_Kort.begin();
 for(iter = m_Kort.begin(); iter != m_Kort.end(); ++iter)
 {
  delete *iter;
  *iter = 0;
 }
 m_Kort.clear();
}

int Hånd::HentTotal() const
{
 if (m_Kort.empty())
  return 0;
 
 if (m_Kort[0]->HentVærdi() == 0)
  return 0;
 
 //Når vi er nået hertil, kan det kun betyde at ingen af kortene er vendt om, og at hånden ikke er tom
 int total = 0;
 vector<Kort*>::const_iterator iter;
 
 for(iter = m_Kort.begin(); iter != m_Kort.end(); ++iter)
 {
  total += (*iter)->HentVærdi();
 }
 
 //find ud af om hånden indeholder et es
 bool IndeholderES = false;
 for (iter = m_Kort.begin(); iter != m_Kort.end(); ++iter)
 {
  if((*iter)->HentVærdi() == Kort::ES)
   IndeholderES = true;
 }
 
 //hvis hånden indeholder et ES, skal vi se om det skal tydes som 1 eller 11
 if (IndeholderES && total <= 11)
  total += 10;

return total;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////HER BEGYNDER GenetiskSpiller classen////////////////////

class GenetiskSpiller: public Hånd
{
 friend ostream& operator<<(ostream& os, const GenetiskSpiller& enGenetiskSpiller);
 
 public:
  GenetiskSpiller(const string& = "");
  
  virtual ~GenetiskSpiller();
  
  //abstract funktion
  virtual bool FlereKort() const = 0;
  
  bool ErBusted() const;
  
  void AnnoncerBusted() const;
 
 protected:
  string m_Name;
};

GenetiskSpiller::GenetiskSpiller(const string& name): m_Name(name)
{}

GenetiskSpiller::~GenetiskSpiller()
{}

bool GenetiskSpiller::ErBusted() const
{
 return (HentTotal()> 21);
}

void GenetiskSpiller::AnnoncerBusted() const
{
 cout << m_Name << " er blevet busted.\n";
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////HER STARTER SPILLER CLASSEN///////////////////////////

class Spiller: public GenetiskSpiller
{
 public: 
  Spiller(const string& name = "");
  
  virtual ~Spiller();
  
  virtual bool FlereKort() const;
  
  void Vundet() const;
  void Tabt() const;
  void Uafgjort() const;
};

Spiller::Spiller(const string& name): GenetiskSpiller(name)
{}

Spiller::~Spiller()
{}

bool Spiller::FlereKort() const
{
 cout << m_Name << "vil du have flere kort?(Y/N): ";
 char svar;
 cin >> svar;
 return (svar == 'y' || svar == 'Y');
}

void Spiller::Vundet() const
{
 cout << "Tillykke " << m_Name << " har vundet\n";
}

void Spiller::Tabt() const
{
 cout << "Desværre " << m_Name << " du har tabt\n";
}

void Spiller::Uafgjort() const
{
 cout << m_Name << " lave uafgjort mod computeren!\n";
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////HER BEGYNDER HUS CLASSEN//////////////////////////////

class Hus: public GenetiskSpiller
{
 public:
  Hus(const string& name = "Huset");
  
  virtual ~Hus();
  
  virtual bool FlereKort() const;
  
  void VendFørsteKort();
};

Hus::Hus(const string& name): GenetiskSpiller(name)
{}

Hus::~Hus()
{}

bool Hus::FlereKort() const
{
 return (HentTotal() <= 16);
}

void Hus::VendFørsteKort()
{
 if (!(m_Kort.empty()))
  m_Kort[0]->Vend();
 else cout << "Ingen kort at vende\n";
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////HER STARTER DÆK CLASSEN////////////////////////////

class Dæk: public Hånd
{
 public:
  Dæk();
  
  virtual ~Dæk();
  
  void LavDæk();
  
  void Bland();
  
  void Deal(Hånd& enHånd);
  
  void FlereKortTilSpiller(GenetiskSpiller& enGenetiskSpiller);
};

Dæk::Dæk()
{
 m_Kort.reserve(52);
 LavDæk();
}

Dæk::~Dæk()
{}

void Dæk::LavDæk()
{
 Slet();
 
 for (int s = Kort::KLØR; s <= Kort::SPAR; ++s)
  for (int r = Kort::ES; r <= Kort::KONGE; ++r)
   TilføjKort(new Kort(static_cast<Kort::rank>(r), static_cast<Kort::kulør>(s)));
      
}

void Dæk::Bland()
{
 random_shuffle(m_Kort.begin(), m_Kort.end());
}

void Dæk::Deal( Hånd& enHånd)
{
 if (!m_Kort.empty())
 { 
  enHånd.TilføjKort(m_Kort.back());
  m_Kort.pop_back();
 }
 else
  cout << "Ikke flere kort, er ikke i stand til at Deale\n";
}

void Dæk::FlereKortTilSpiller(GenetiskSpiller& enGenetiskSpiller)
{
 cout << endl;
 
 while ( !(enGenetiskSpiller.ErBusted()) && enGenetiskSpiller.FlereKort())
 {
  Deal(enGenetiskSpiller);
  cout << enGenetiskSpiller << endl;
  
  if (enGenetiskSpiller.ErBusted())
   enGenetiskSpiller.AnnoncerBusted();
 }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////HER STARTER GAME CLASSEN//////////////////////////////

class Spillet
{
 public:
  Spillet(const vector<string>& navne);
  
  ~Spillet();
  
  void Spil();
  
 private:
  Dæk m_Dæk;
  Hus m_Huset;
  vector<Spiller> m_Spillere;
};

Spillet::Spillet(const vector<string>& navne)
{
 //laver en vector af spillere, ud fra en vector med navne
 vector<string>::const_iterator pNavne;
 for( pNavne = navne.begin(); pNavne != navne.end(); ++pNavne)
  m_Spillere.push_back(Spiller(*pNavne));
 
 srand(time(0));
 m_Dæk.LavDæk();
 m_Dæk.Bland();
}

Spillet::~Spillet()
{}

void Spillet::Spil()
{
 vector<Spiller>::iterator pSpiller;
 
 for (int i = 0; i < 2; ++i)
 {
  for (pSpiller = m_Spillere.begin(); pSpiller != m_Spillere.end(); ++pSpiller)
   m_Dæk.Deal(*pSpiller);
  
  m_Dæk.Deal(m_Huset);
 }  
 //gem husets første kort
 m_Huset.VendFørsteKort();
  
 //vis alles kort
 for (pSpiller = m_Spillere.begin(); pSpiller != m_Spillere.end(); ++pSpiller)
  cout << *pSpiller << endl;
 cout << m_Huset << endl;
 
 //giv flere kort til spillere
 for( pSpiller = m_Spillere.begin(); pSpiller != m_Spillere.end();++pSpiller)
  m_Dæk.FlereKortTilSpiller(*pSpiller);
  
 //vis husets første kort
 m_Huset.VendFørsteKort();
 cout << endl << m_Huset << endl;
 
 //giv flere kort til huset
 m_Dæk.FlereKortTilSpiller(m_Huset);
 
 if(m_Huset.ErBusted())
 {
  for( pSpiller = m_Spillere.begin(); pSpiller != m_Spillere.end(); ++pSpiller)
   if (!(pSpiller->ErBusted()))
    pSpiller->Vundet();
 }
 else
 {
  for (pSpiller = m_Spillere.begin(); pSpiller != m_Spillere.end(); ++pSpiller)
   if (!(pSpiller->ErBusted()))
   {
    if (pSpiller->HentTotal() > m_Huset.HentTotal())
     pSpiller->Vundet();
    else if ( pSpiller->HentTotal() < m_Huset.HentTotal())
     pSpiller->Tabt();
    else
     pSpiller->Uafgjort();
   }
 }

//fjerner alles kort
for (pSpiller = m_Spillere.begin(); pSpiller != m_Spillere.end(); ++pSpiller)
 pSpiller->Slet();
m_Huset.Slet();
}

//funktions prototyper
ostream& operator<<(ostream& os, const Kort& etKort);
ostream& operator<<(ostream& os, const GenetiskSpiller& enGenetiskSpiller);

//main()
int main()
{
 cout << "\t\t Velkommen til Blackjack!\n\n\n";
 
 int numSpillere = 0;
 
 while( numSpillere < 1 || numSpillere > 7)
 {
  cout << "Hvor mange spillere?(1-7): ";
  cin >> numSpillere;
 }
 
 vector<string> navne;
 string navn;
 
 for (int i = 0; i < numSpillere; ++i)
 {
  cout << "Skriv spiller " << i <<"'s navn: ";
  cin >> navn;
  navne.push_back(navn);
 }
 cout << endl << endl;
 
 //the game loop
 Spillet etSpil(navne);
 char igen = 'y';
 
 while (igen != 'n' && igen!= 'N')
 {
  etSpil.Spil();
  cout << "Tak for spillet. Vil du spille igen?(Y/N): ";
  cin >> igen;
 }

return 0;
}

//overloader <<operatoren så Kort objekter kan sendes til cout
ostream& operator<<(ostream& os, const Kort& etKort)
{
 const string RANK[] = { "0", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "B", "D", "K"};
 const string KULØR[] = { "K", "R", "H", "S"};
 
 if(etKort.m_ErVendtOp)
  os << RANK[etKort.m_Rank] << KULØR[etKort.m_Kulør];
 else
 os << "XX";

return os;
}

//overloader << operatoren så GenetiskSpiller objekter kan sendes til cout
ostream& operator<<(ostream& os, const GenetiskSpiller& enGenetiskSpiller)
{
 os << enGenetiskSpiller.m_Name << ":\t";
 
 vector<Kort*>::const_iterator pKort;
 
 if(!enGenetiskSpiller.m_Kort.empty())
 {
  for (pKort = enGenetiskSpiller.m_Kort.begin(); pKort != enGenetiskSpiller.m_Kort.end(); ++pKort)
   os << *(*pKort) << "\t";
   
  if (enGenetiskSpiller.HentTotal() != 0)
   cout << "(" << enGenetiskSpiller.HentTotal() << ")";
 }
 else
 {
  os << "<empty>";
 }
return os;
}


errors:
Quote:
Error 2 error LNK2028: unresolved token (0A0003FF) "public: void __thiscall Hånd::TilføjKort(class Kort *)" (?TilføjKort@Hånd@@$$FQAEXPAVKort@@@Z) referenced in function "public: void __thiscall Dæk::LavDæk(void)" (?LavDæk@Dæk@@$$FQAEXXZ) main Error 3 error LNK2019: unresolved external symbol "public: void __thiscall Hånd::TilføjKort(class Kort *)" (?TilføjKort@Hånd@@$$FQAEXPAVKort@@@Z) referenced in function "public: void __thiscall Dæk::LavDæk(void)" (?LavDæk@Dæk@@$$FQAEXXZ) main Error 4 fatal error LNK1120: 2 unresolved externals C:\Documents and Settings\mads\Dokumenter\Visual Studio 2005\Projects\BLACKJACK\Debug\BLACKJACK.exe
the last error is probaly related to the 2 others (even though it probaly is "just" one error. The problem seems to be around the "Dæk::LavDæk()" function but i cant realy hunt it down. If anyone can help me solve these problems/ translate the errors, it is greatly appreciated! -Mads

Share this post


Link to post
Share on other sites
Simple actually, you declare the member function Hånd::TilføjKort, but there is no body (e.g. no code for the function).

I'm surprised that you don't have problems using the extended characters, i always refrain from using the umlauts.

Share this post


Link to post
Share on other sites
Quote:
Original post by Endurion
I'm surprised that you don't have problems using the extended characters, i always refrain from using the umlauts.


Actually, Visual Studio 2005 compiler & linker supports Unicode. You can read more about it here.

Share this post


Link to post
Share on other sites
thanks Endurion! i added the missing function

void Hånd::TilføjKort(Kort* pKort)
{
m_Kort.push_back(pKort);
}

i had no idea, what i had forgotten :D thanks for your help. My blackjack game is now up and running!

Share this post


Link to post
Share on other sites

This topic is 3865 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this