Bi Direction-associatie in C ++

Ik heb geprobeerd om twee klassen te definiëren

class state03: public state
{
public:
    std::string name;   
    state03(bool inAcceptState, bool inRejectState)
    {
        setRejectState(inRejectState);
        setAcceptState(inAcceptState);
        name="State 03";
    }

    state * evalNextState(char input)
    {
         if(input==' ')
        {
            return this;
        }
         if(isalpha(input) || input=='_')
         {
             return new state04(false,false);
         }
        return new RejectState();
    }
};

class state04: public state
{
public:
    std::string name;
    state04(bool inAcceptState, bool inRejectState)
    {
        setRejectState(inRejectState);
        setAcceptState(inAcceptState);
        name="State 04";
    }
    state * evalNextState(char input)
    {
        if(isalnum(input) || input=='_')
        {
            return this;
        }
        if(input==',')
        {
            return new state03(false,false);
        }
        return new RejectState();
    }
};

en aangezien de compiler de code van boven naar beneden scant, ontvang ik deze compilatiefout dat class state04 niet gedefinieerd is omdat het is gedefinieerd na class state03 ...

dus hoe kan ik de bidirectionele relatie bereiken?

1

2 antwoord

U moet uw implementatiedetails in een afzonderlijk bestand verplaatsen, wat in dat geval de beste en gemakkelijkste manier is:

state03.h

class state03 : public state {
  //...
   state * evalNextState(char input);
}

state04.h

class state04 : public state {
  //...
}

state03.cpp

#include "state03.h"
#include "state04.h"

state * state03::evalNextState(char input) {
   //your code here
}
4
toegevoegd
user1043565: scheid eenvoudig uw verklaring van uw implementatie, dat is de juiste manier. Ik heb de forward-declaratie van het antwoord verwijderd, het is niet echt van toepassing in jouw geval omdat je de constructor state04 met argumenten aanroept (ik heb dat de eerste keer gemist). Als u probeert te decoderen state04 , resulteert dit in een ongeldig gebruik van onvolledige -fout.
toegevoegd de auteur netcoder, de bron
@ user1043565: Kunt u de bijgewerkte code aan de vraag toevoegen? Dit zou niet moeten gebeuren als het goed wordt gedaan.
toegevoegd de auteur netcoder, de bron
Ik heb de forward-declaratie geprobeerd, maar omdat ik de constructor van de klasse gebruik voordat ik deze zelf definieer, ontvang ik een andere compilatiefout.
toegevoegd de auteur user1043565, de bron
toen ik de methode-implementatie van het header-bestand beschreef, ontving ik deze fout "'this": kan alleen worden geraadpleegd binnen niet-statische lidfuncties ". ideeën?
toegevoegd de auteur user1043565, de bron
hartelijk dank voor uw steun, u hebt gelijk, ik heb niet aangegeven in welke klasse ik werk in de methodedefinitie, en dat is dat de compiler de nieuwe methode ziet als een statisch blok.
toegevoegd de auteur user1043565, de bron

Neem de implementaties uit de klassedefinities en verplaats ze naar een implementatiebestand.

0
toegevoegd