2 Friend-Klassen funktionieren nicht, eine schon
-
gnihihihihi schrieb:
Ich bin mir nicht sicher, ob das dein Problem löst (kann im Konstruktor der Klasse C_Dialog keinen Fehler erkennen), aber in der Klasse B_Dialog lauert ein Fehler: Der Member
A_Data* const myDatasist ein konstanter Pointer, der Konstruktor erwartet aber einen nicht-konstanten Pointer mit konstantem Wert (A_Data const*).Beachte, dass das Schlüsselwort
constsich auf das bezieht, was links neben ihm steht.Edit: Nach genauerem Hingucken, hab ich nun gemerkt, dass Du den gleichen Fehler auch in der C_Dialog-Klasse machst.
Ah. Da haben wir's ja schon - hab ich nicht gesehen.

-
Hallo,
danke für die schnellen Antworten.
Aber es war Schlamperei von mir bei der Eingabe, sorry
Es heißt natürlich wie folgt und der Fehler ist immer noch vorhanden (s.u.):
B_Dialog.h //bzw. C_Dialog.h class A_Data class B_Dialog // bzw. C_Dialog.h { friend class A_Data; // Datenklasse public: explicit B_Dialog( A_Data * const datas); // bzw. explicit C_Dialog( A_Data * const datas); private: A_Data * const myDatas; //... } B_Dialog.cpp // bzw. C_Dialog.h #include 'A_Data.h' B_Dialog::B_Dialog // bzw. C_Dialog::C_Dialog ( A_Data * const datas) : myDatas(datas) {}Ich habe das noch einmal genau kontrolliert, kompiliert und die Compilermeldung lautet jetzt:
C_Dialog.cpp: error 2440: 'Initialisierung': A_Data *const kann nicht in A_Data *const konvertiert werden. Die Typen, auf die verwiesen wird, sind nicht verknüpft, die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
Gruß
-
Ist C_Dialog zufälligerweise in einem anderen Namespace als A_Data?
-
Nein
-
Ich verstehe einfach nicht, warum der B_Dialog einwandfrei kompiliert und der C_Dialog nicht. Ich vermute. daß es etwas mit der Reihenfolge von Deklaration zu tuen hat, kann mir aber (auf Grund fehlenden Wissens oder Erfahrung) keinen Reim darauf machen.

-
Dann befolge http://www.c-plusplus.net/forum/304133 und zeig uns das, was übrig bleibt.
-
Der Fehler hat auf jeden Fall nicht direkt mit
friendzu tun, sondern damit dass es zwei verschiedene, nicht verwandte Klassen namensA_Datagibt.Vermutlich bestehen Unterschiede zwischen der Deklaration oder Definition von
B_DialogundC_Dialogdie du hier "rausgekürzt" hast, die dafür verwantwortlich sind dass es mitB_Dialoggeht, mitC_Dialogaber nicht.
-
zu hustbaer:
Es gibt keine "zwei verschiedene, nicht verwandte Klassen namens A_Data".zu Nathan:
Es scheint wohl kein prinzipieller Fehler zu sein wie ich anfangs vermutete, sondern die Teufel steckt wohl im Detail. Ich versuche also einmal gemäß Link den Code zu reduzieren, so daß der Fehler noch auftritt und die Menge der Zeilen noch übersichtlich zur Darstellung bleibt.
Dauert aber, habe erst morgen Zeit.
Danke erst einmal für die bisher getätigten Beiträge !
-
hinzman3 schrieb:
zu hustbaer:
Es gibt keine "zwei verschiedene, nicht verwandte Klassen namens A_Data".Lass mich raten: es gibt keine Klasse namens A_Data im echten Code!

Aber so etwas passiert wirklich schnell, besonders bei Forwards.Edit: Bei dir reicht es übrigens, sämtliche Member zu löschen und die Header zu posten.
-
Hallo,
nachdem die Reduzierung des Quellcodes nichts gebracht hat,habe ich mal unter dem Visual Studio 2008 ein neues Projekt als Konsolenprogramm erstellt mit der gleichen Konfiguration wie bereits oben geschrieben sowie C++-Klassen (keine MFC) → keine Fehlermeldung !
Das brachte mich auf die Idee testweise die ganze C_Dialog Klasse in dem MFC-Projekt zu löschen und wieder neu unter dem ähnlichen Namen C1_Dialog anzulegen.Und siehe da, alles wird gut, keine Fehlermeldung mehr:

C1_Dialog.h
class C1_Dialog : public CDialogEx { friend class A_Data; public: explicit C1_Dialog ( A_Data * const mydatas ); private: C1_Dialog(CWnd* pParent = NULL); // Standardkonstruktor virtual ~C1_Dialog(){}; A_Data * const myDatas; // Dialogfelddaten enum { IDD = IDD_FORMVIEW }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung DECLARE_MESSAGE_MAP() };dazu dann C1_Dialog.cpp
// C1_Dialog.cpp: Implementierungsdatei // #include "stdafx.h" #include "C1_Dialog.h" #include "afxdialogex.h" // C1_Dialog-Dialogfeld C1_Dialog::C1_Dialog ( A_Data * const mydatas ) : CDialogEx(C1_Dialog::IDD), myDatas(mydatas) { } void C1_Dialog::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(C1_Dialog, CDialogEx) END_MESSAGE_MAP() // C1_Dialog-MeldungshandlerIch arbeite schon länger dem Projekt und weiß nicht welche Vorgeschichte die Klasse C_Dialog hatte. Aber egal, jetzt kann ich auf alle Fälle weitermachen
und die Dialogklasse wieder neu aufbauen. Manchmal hilft ein finaler Cut.Danke an Alle für Ihre Bemühungen.
Bis zum nächsten mal.
