[C ++] Feil C2027: Udefinert type brukt, gjensidig referansemedlem mellom to klasser, fremovererklæring

Error C2027 Undefined Type Used



Feil C2027: Bruk av udefinert type, referansemedlemmer mellom to klasser, fremovererklæring

Når du konstruerer din egen klasse, kan du støte på gjensidige referanser mellom de to klassene
For eksempel: klasse A og klasse B er definert, A bruker typen definert av B, og B bruker også typen definert av A
  1. Hvis du bare bruker den andre klassen som en metodeparameter i de to klassene, eller definerer pekeren og referanseoppførselen til typen, kan du bruke videresendedeklarasjon

    Henvisninger til udefinerte typer er ikke tillatt:
    bilde
    Bruk fremover erklæring for å løse:
    bilde

  2. Etter at fremoverdeklarasjonen er brukt, før klassedefinisjonen, er klassen en inkompetent type, det vil si at det er kjent at den fremdeklarerte klassen er en type, men den vet ikke hvilke medlemmer den inneholder, så etter bruk av fremover erklæring, Før klassen er definert, kan du bare definere pekere og referanser til typen, og du kan ikke bruke klassemedlemmene



    Klassemedlemmer kan ikke brukes før klassedefinisjonen
    bilde



Gjennom separate samlings- og fremdriftserklæringsmetoder for å oppnå gjensidige referansemedlemmer mellom to klasser

Fremoverdeklarerte metoder kan ikke bruke klassemedlemmer, og kan bare gjøre kompilatoren kjent med at dette er en klassetype

C ++ forskjellige filer i samme prosjekt ligger i det globale omfanget, og kan også refereres til i andre filer. Hvis en .cpp ønsker å bruke en annen .cpp-definert funksjon, er det bare å skrive sin i denne .cpp-filen Funksjonserklæring

Ved å skille forskjellige klasser i forskjellige klassefiler, skiller forskjellige klasser klassedeklarasjoner og klassedefinisjoner. Når andre klasser må brukes, kan målklassen brukes ved å introdusere toppfilen (introdusere erklæringen) til målklassen



Overskriftsfilerklæring

#pragma once #include <iostream> #include'SeparateCompilationClass1.h'//After the compilation is complete, the preprocessor adds the content of the file to the program, and the header file has the complete declaration of class B using namespace std class B//Use forward declaration, the compiler indicates this is a class type, so that the header file declaration is compiled class A { public: void fun(B* b)//Because it is a declaration, class members are not used, and forward declarations can be compiled }

bilde

Implementering av kildefil

#include'SeparateCompilationClass2.h'//The header file of class A, in which the header file of B is referenced, has the completion statement of B, so class B members can be used in this file void A::fun(B* b) {//Add member definitions for class A through the scope operator cout << 'Method in A' << endl cout << 'Use members from B:' << endl b->fun()//The members in B can be used through separate compilation }

bilde