Klassen - Prototypen?!



  • Hallo,
    ich habe mal einen simplen Code erstellt um zu testen.
    Hier der Code:

    #include<iostream>
    
    using namespace std;
    
    class A;
    class B;
    
    class A
    {
    public:
    	void get()
    	{
    		B b;
    		b.get();
    	}
    };
    class B
    {
    public:
    	void get()
    	{
    		cout << "hallo" << endl;
    	}
    };
    
    int main(int argc, char **argv)
    {
    	A a;
    	a.get();
    	return 0;
    }
    

    Aber nun gibt der G++ Compiler diesen Fehler aus:

    test.cpp: In member function void A::get()': test.cpp:13: error: aggregateB b' has incomplete type and cannot be defined

    Ich weiss, dass es mit dem "Prototyp" der Klasse zu tun hat, aber was schafft abhilfe? Ausser die klasse B vor A zu schreiben, ich möchte ja auf diese Problematik eingehen 😃

    Danke!



  • B b;
            b.get();
    

    dafür muss der Compiler ja wenn er diesen Code kompiliert die Klasse B kennen um genug Speicher auf den Stack anzulegen und die Funktion aufzurufen.

    Prototyping hilft dir da wo der Compiler das nicht wissen muss, also bei Pointern und Referenzen.

    class foo;
    
    class bar {
      foo *x; //hier
    public:
      void moep(foo const &obj) const; //und hier ist das foo ok, da der Compiler
                                       //nichts genaueres (wie größe oder Member)
                                       //über foo wissen muss.
    };
    
    class foo {
      int i;
    public:
      foo(int j) : i(j) { }
    };
    
    foo *bar::moep() {
      return new foo(10); //hier ist die Größe von foo bekannt, also kann man hier new oä. machen
    }
    


  • Ja das verstehe ich schon, aber wie schaut es aus bei meinem Problem? Ich finde dafür keine passende Lösung?!



  • Ich weiß net ab dasn dummer Vorschlag ist, aber warum lässt du das mit den Prototypen nicht weg und schreibst A vor B?



  • probb schrieb:

    Ja das verstehe ich schon, aber wie schaut es aus bei meinem Problem? Ich finde dafür keine passende Lösung?!

    du kannst die Funktion ja erst später implementieren. Dann weiss der Compiler auch über B bescheid 🙄


Anmelden zum Antworten