Gegenseitiges includen ?



  • Hallo,

    Hab ein Projekt mit 3 Klassen, mal ganz grob gesagt...
    A[#include "B.h"] ruft B auf, B[#include "C.h"] ruft C auf und jetzt sollte C (mittels #include "B.h" vermut ich mal) die ListView in der Klasse B aktualisieren bzw. ändern. Nur was mir grad überhaupt nicht eingeht ist, dass wenn ich nen include in der Klasse C setze, dass er mir eine Fehlermeldung bringt und über die Verweise auf die anderen aufrufe was Klasse B anbelangt rummault.
    Also schlicht weg entweder include ich B ODER C aber es gehen ned beide.

    Wäre froh wenn mir jemand helfen könnte, da ich grad irgendwie voll aufm Schlauch steh^^



  • Hallo!
    Wie du selbst festgestellt hast, wird das so nichts.
    Müssen die Klassen im Header bekannt sein (oder reicht
    eine Forward-Deklaration)? Wenn jeweils nur Referenzen
    auf die Klassen benötigt werden, dann reicht

    in "C.h":

    class B
    
    B^ b;
    

    und in "B.h":

    class C
    
    C^ c;
    

    Die Implementation der Funktionen, die auf b bzw c zugreifen,
    müssten dann jeweils in die cpp-Dateien (mit den entsprechenden
    includes).

    Alex



  • von Klasse B kann ich mittels Instanz auf C zugreifen und sogar eine Methode aufrufen (#include "C.h" liegt in der B.cpp)... naja, indirekt aufrufen, da er den Code der Methode zwar durchläuft, (sogar 2mal, warum überhaupt 😕 😕 😕 ), ihn aber nicht ausführt - WTF



  • Mit so mageren Informationen wirst Du keine brauchbaren Antworten ernten.



  • also nochmal in der langen Fassung 😃

    Hab 2 Klassen, A und B, die sich gegenseitig aufrufen.
    hier mal die Wichtigsten Sachen was die Klassen anbelangt.
    PS: Vorher waren es A, B, C - Ich minimiere des jetzt mal nen bissl um es verständlicher zu machen.

    A.h
    #pragma once // auch in der B.h vorhanden
    #include "B.h"
    B ^b;

    A.cpp
    b = gcnew B();
    b->show(); // funktioniert auch

    B.cpp
    #include "A.h"
    A ^a = gcnew A();
    a->listeFuellen(); // Methodenaufruf

    ... und jetz das schon alt bekannte Problem. listeFuellen() wird aufgerufen (2mal, warum 2mal 😕 ) aber nicht ausgeführt.
    Mit aufgerufen mein ich dass er den Code normal durchläuft, vom Anfang bis zum Ende, ich kann auch die einzelnen Items der Listview anzeigen lassen während er den Code so durchgeht. Nachdem er dann die Methode durchgegangen ist sollte er ja jetzt die Liste füllen, macht er aber nicht. Wie gesagt er geht den Code durch, führt ihn aber nicht aus.
    Wenn ich aber von der A.cpp die listeFuellen() aufrufe funktioniert alles wunderbar und die Liste wird aktualisiert/gefüllt.

    Hoffe mal dass es jetzt etwas verständlicher ist 😃



  • Du hast es wie ein Politiker gemacht. Mehr Worte - aber der Inhalt ist kein deut besser geworden.

    ... und jetz das schon alt bekannte Problem. listeFuellen() wird aufgerufen (2mal, warum 2mal 😕 ) aber nicht ausgeführt.

    Woher sollen wir jetzt wissen warum die Methode 2 mal aufgerufen wird ? Du zeigst kein bisschen Code der da irgendwas erkennen lässt. Btw.: Benutze bitte CodeTags.



  • Woher Ihr wissen sollt warum die Methode 2mal aufgerufen wird ?
    *BUG ?

    ...warum glaubst schreib ich hier rein - und nicht nur wegen dem 2fachen Aufruf, das is Nebensache - die Methoden ist 1a. Wenn dann liegt der fehler irgendwo beim Aufruf der Methode innerhalb einer anderen Klasse (gegenseitiger Aufruf), sonst würde er ja schon alleine deswegen den Code ausführen anstatt wie in dem Fall nichts machen.
    Erzähl mir lieber wie ich es realisieren kann wie man die Methode ausführt, wohl gemerkt ausführt.



  • Ich muss mich Knuddlbaer anschließen!
    Es sind ein bisschen wenig Informationen,
    um herauszufinden, was der Fehler ist...

    Ich kann nur raten:

    Du erzeugst ein neues B (was auch immer das ist - ein Control?):
    In A.cpp

    b = gcnew B(); 
    b->show();
    

    Ich vermute mal, dass du das innerhalb einer Member-Funktion
    von A machst.

    Und in B erzeugst du ein neues A (obwohl du doch vermutlich
    schon ein A hast - nämlich das, aus dem das B-Objekt erzeugt
    wurde...)

    B.cpp

    #include "A.h" 
    A ^a = gcnew A(); 
    a->listeFuellen();
    

    Zeigst du das neue A überhaupt an (falls das ein Form ist)?
    Ansonsten wird das an den Garbage Collector übergeben, sobald
    du den Block verlässt (a scheint ein lokales Objekt zu sein, da
    es ja in der cpp-Datei deklariert wird).
    Oder wolltest du auf das erste A zugreifen???

    Alex


Anmelden zum Antworten