Ich erhalte eine Fehlermeldung "ungültige Verwendung der unvollständigen Klassenübersicht"
Mache ich einen einfachen text-basierten RPG sorry, wenn meine Frage dumm ist, weil im neuen c++. Grundsätzlich habe ich damit einen kleinen Kampf der Klasse, dass ich zu link und zurück, um aus der map-Klasse, so hatte ich Sie weiterleiten zu erklären, meine Karte Klasse und es kommt der Fehler. BTW sorry, es gibt keine Kommentare.
Hier ist der Fehler: invalid use of incomplete type class Map
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
class Map;
class Player
{
public:
int health;
int damage;
int defense;
int gems=0;
string race;
string name;
string location;
};
class Enemy
{
public:
int ehealth;
int edamage;
int edefense;
int echoice;
};
class combat
{
public:
Map* mapobj;
int damagedealt;
Player playerobj;
Enemy enemeyobj;
string cchoice;
string retry;
void initial()
{
cout <<"A wild orc has appeared\n";
cout <<"What do you do?\n";
cout <<"---------------------------\n";
cout <<"|-------------------------|\n";
cout <<"|----Attack-----Defend----|\n";
cout <<"|-------------------------|\n";
cout <<"---------------------------\n";
cin >>cchoice;
this->battle();
}
void newturn()
{
cout <<"The orc is still alive!";
cout <<"What do you do?";
cout <<"\n---------------------------\n";
cout <<"|-------------------------|\n";
cout <<"|----Attack-----Defend----|\n";
cout <<"|-------------------------|\n";
cout <<"---------------------------\n";
cin >>cchoice;
this->battle();
};
void battle()
{
enemeyobj.echoice = rand() % 2;
if (enemeyobj.echoice= 1)
{
if (cchoice=="Attack")
{
playerobj.damage;
enemeyobj.ehealth=enemeyobj.ehealth-playerobj.damage;
cout <<"You did "<<playerobj.damage<<" points of damge to the enemey.\n";
if (enemeyobj.ehealth>0)
{
playerobj.health=enemeyobj.edamage-playerobj.health;
cout <<"The enemyattacked you. You now have "<<playerobj.health<<" health";
if (playerobj.health>0)
{
this->newturn();
}
else if (playerobj.health<=0)
{
cout <<playerobj.name<<"was killed\n";
cout <<"Game Over";
}
}
else if (enemeyobj.ehealth<=0)
{
cout <<"You have defeated the orc!";
if (playerobj.location=="a")
{
mapobj->relaypointa();
}
}
}
else if (cchoice=="Defend")
{
damagedealt=enemeyobj.edamage-playerobj.defense;
playerobj.health=damagedealt-playerobj.health;
cout <<"You defend but the enemey was able to deal\n";
cout <<damagedealt<<" points of damage your health is\n";
cout <<playerobj.health;
if (playerobj.health>0)
{
this->newturn();
}
else if (playerobj.health<=0)
{
cout <<playerobj.name<<"was killed\n";
cout <<"Game Over";
}
}
}
else if (enemeyobj.echoice=2)
{
if (cchoice=="Attack")
{
damagedealt=enemeyobj.edefense-playerobj.damage;
enemeyobj.ehealth=enemeyobj.ehealth-damagedealt;
cout <<"You did "<<damagedealt<<" points of damage to the enemey";
if (enemeyobj.ehealth>0)
{
this->newturn();
}
else if (enemeyobj.ehealth<=0)
{
cout <<"You have defeated the orc!";
mapobj->relaypointa();
}
}
else if (cchoice=="Defend")
{
cout <<"Both parties defended";
this->newturn();
}
}
}
};
class Map
{
public:
combat combatobj;
string mchoice;
int espawn;
Player playerobj;
Enemy enemeyobj;
void relaypointaespawn()
{
playerobj.location=="relaypointa";
enemeyobj.ehealth = rand() % 50 + 100;
enemeyobj.edamage = rand() % 50 + 75;
enemeyobj.edefense = rand() % 50 + 50;
combatobj.initial();
}
void relaypointa()
{
cout <<"You have found yourself at the\n";
cout <<"mouth of a mighty river to the north\n";
cout <<"What do you want to do?\n";
}
void relaypointb()
{
playerobj.location=="relaypointb";
cout << "\n\n%%%%%%%%%%%%%%%%%%%%\n";
cout << "% %\n";
cout << "% #Wild North# %\n";
cout << "% %\n";
cout << "%%%%%%%%%%%%%%%%%%%%\n\n";
cout <<"You have entered the wild north this is where your journey starts\n";
cout <<"What would you like to do\n\n";
cin >>mchoice;
if (mchoice=="Travel")
{
cout <<"Where would you like to travel?\n";
cin >>mchoice;
if (mchoice=="North")
{
}
else if (mchoice=="East")
{
}
else if (mchoice=="South")
{
}
else if (mchoice=="West")
{
this->relaypointaespawn();
}
else
{
cout <<"Invalid command\n\n";
this->relaypointb();
}
}
}
void relaypointcespawn()
{
playerobj.location=="a";
enemeyobj.ehealth = rand() % 50 + 100;
enemeyobj.edamage = rand() % 50 + 75;
enemeyobj.edefense = rand() % 50 + 50;
espawn = rand() % 2;
}
};
InformationsquelleAutor der Frage user2998425 | 2013-11-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihrer ersten Nutzung der
Map
ist innerhalb einer Funktion in dercombat
. Das passiert vorMap
definiert ist, daher der Fehler.Einer forward-Deklaration sagt nur, dass eine bestimmte Klasse wird später festgelegt werden, so ist es ok, um die Referenz oder Zeiger auf Objekte, etc. Aber eine forward Deklaration nicht sagen, was die Mitglieder einer Klasse hat, also so weit wie der compiler ist besorgt, Sie können nicht alle von Ihnen, bis
Map
vollständig erklärt.Die Lösung ist, Folgen Sie der C++ - Muster der Deklaration der Klasse in einer
.h
- Datei und die Funktion Körper in einem.cpp
. So alle Meldungen angezeigt werden, bevor die ersten Definitionen und der compiler weiß, was es ist.InformationsquelleAutor der Antwort Adam
Ich bin nur ein weiterer Fall, wo bekommen Sie diese Fehlermeldung. Die Lösung wird die gleiche sein, wie Adam bereits erwähnt. Dies ist aus einer echten code und umbenannt habe ich den Namen der Klasse.
Oben wird keine pass-compiler und erhalten den Fehler: invalid use of incomplete type FooReaderPrivate. Sie haben im Grunde setzen Sie die inline-Anteil in der *.cpp Implementierung Datei. Das ist OK. Was ich versuche hier zu sagen ist, dass Sie möglicherweise ein design-Problem. Cross-Referenz von zwei Klassen kann notwendig sein, einige Fälle, aber ich würde sagen, es ist besser, Sie zu vermeiden, zu Beginn des design. Ich wäre falsch, aber bitte mit Kommentar, dann werde ich auf mein posting.
InformationsquelleAutor der Antwort Kemin Zhou