Ik krijg de foutmelding “ongeldig gebruik van incomplete type ‘class map’

Ik ben een op tekst gebaseerde RPG aan het maken. Sorry als mijn vraag stom is, want ik ben nieuw in c++. Dus eigenlijk heb ik een kleine gevechtsklasse waarnaar ik heen en weer moet linken vanuit de kaartklasse, dus ik moest mijn kaartklasse doorsturen en het komt met de fout. BTW sorry er zijn geen reacties.

Dit is de fout: 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;
    }
};

Antwoord 1, Autoriteit 100%

Uw eerste gebruik van Mapbevindt zich in een functie in de combatklasse. Dat gebeurt vóór Mapis gedefinieerd, vandaar de fout.

Een voorwaartse verklaring zegt alleen dat een bepaalde klasse later zal worden gedefinieerd, dus het is OK om het te verwijzen of aanwijzingen naar objecten, enz. Een voorwaartse verklaring zegt niet wat leden een klasse heeft, dus voor zover de compiler Betrokken je kunt geen van hen gebruiken tot Mapis volledig gedeclareerd.

De oplossing is om het C++ -patroon van de Class-verklaring in een .h-bestand en de functie-instellingen in een .cppte volgen. Op die manier verschijnen alle aangiften vóór de eerste definities en de compiler weet waar het aan werkt.


Antwoord 2, Autoriteit 4%

Ik geef alleen een ander geval aan waarin u deze foutmelding kunt krijgen. De oplossing zal dezelfde zijn als Adam hierboven heeft genoemd. Dit is van een echte code en ik heb de klassenaam hernoemd.

class FooReader {
  public:
     /** Constructor */
     FooReader() : d(new FooReaderPrivate(this)) { }  // will not compile here
     .......
  private:
     FooReaderPrivate* d;
};
====== In a separate file =====
class FooReaderPrivate {
  public:
     FooReaderPrivate(FooReader*) : parent(p) { }
  private:
     FooReader* parent;
};

Het bovenstaande gaat niet door de compiler en krijgt een foutmelding: ongeldig gebruik van het onvolledige type FooReaderPrivate. U moet in principe het inline-gedeelte in het *.cpp-implementatiebestand plaatsen. Dit is oke. Wat ik hier probeer te zeggen, is dat je misschien een ontwerpprobleem hebt. Kruisverwijzing van twee klassen kan in sommige gevallen nodig zijn, maar ik zou zeggen dat het beter is om ze aan het begin van het ontwerp te vermijden. Ik zou het mis hebben, maar reageer alsjeblieft, dan zal ik mijn bericht bijwerken.

Other episodes