<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[2 Friend-Klassen funktionieren nicht, eine schon]]></title><description><![CDATA[<p>Hallo<br />
ich schlage mich mit der Möglichkeit herum Friend-klassen zu benutzen:<br />
Ich verwende zwar die MFC (VS2010), vermute handelt es sich um ein generelles C++-(Verständnis-)problem:</p>
<p>Ich habe eine Datenklasse, auf deren privaten Member ich gern über die Memberfunktionen mittels zwei Dialogklassen zugreifen würde. Mit der einen Dialogklasse funktioniert es, die zweite will nicht. Es ist sicherlich nicht die Beste-Lösung, aber warum es mit der zeiten Dialogklasse nicht funktioniert, wüsste ich schon ganz gerne. Vieleicht kann mir jemmad weiterhelfen.</p>
<pre><code>A_Data.h

class A_Data
{
   friend class B_Dialog; // 1. Dialogklasse
   friend class C_Dialog; // 2. Dialogklasse
   //.....
}

B_Dialog.h

class A_Data

class B_Dialog
{
   friend class A_Data; // Datenklasse

   public:
   explicit B_Dialog( A_Data const * datas);

   private:
   A_Data * const myDatas;
   //...
}

B_Dialog.cpp
#include 'A_Data.h'

B_Dialog::B_Dialog
( A_Data * const datas)
: myDatas(datas)
{}
</code></pre>
<p>// bis hierhin funktioniert es einwandfrei</p>
<p>Für die zweite Dialogklasse (gleiche Struktur wie B_Dialog):</p>
<pre><code>C_Dialog.h

class A_Data

class C_Dialog
{
   friend class A_Data; // Datenklasse

   public:
   explicit C_Dialog( A_Data const * datas);

   private:
   A_Data * const myDatas;
   //...
}

C_Dialog.cpp
#include 'A_Data.h'

C_Dialog::C_Dialog
( A_Data * const datas)
: myDatas(datas)          // hier Compilerfehler (s.u.)
{}
</code></pre>
<p>gibt es folgende Compilerfehlermeldung:<br />
C_Dialog.cpp: error 2440: 'Initialisierung': const A_Data* kann nicht in const A_Data* 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.</p>
<p>Ich nehme an, es hängt mit der Reihenfolge von Deklarationen zusammen, habe auch schon einige Zeit gegoogelt, komme aber irgendwie nicht weiter.</p>
<p>Vielleicht könnt Ihr mir weiterhelfen.</p>
<p>Vielen Dank schon einmal im vorraus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/316054/2-friend-klassen-funktionieren-nicht-eine-schon</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Jul 2026 09:49:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316054.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 20 Apr 2013 11:52:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 2 Friend-Klassen funktionieren nicht, eine schon on Sat, 20 Apr 2013 11:52:27 GMT]]></title><description><![CDATA[<p>Hallo<br />
ich schlage mich mit der Möglichkeit herum Friend-klassen zu benutzen:<br />
Ich verwende zwar die MFC (VS2010), vermute handelt es sich um ein generelles C++-(Verständnis-)problem:</p>
<p>Ich habe eine Datenklasse, auf deren privaten Member ich gern über die Memberfunktionen mittels zwei Dialogklassen zugreifen würde. Mit der einen Dialogklasse funktioniert es, die zweite will nicht. Es ist sicherlich nicht die Beste-Lösung, aber warum es mit der zeiten Dialogklasse nicht funktioniert, wüsste ich schon ganz gerne. Vieleicht kann mir jemmad weiterhelfen.</p>
<pre><code>A_Data.h

class A_Data
{
   friend class B_Dialog; // 1. Dialogklasse
   friend class C_Dialog; // 2. Dialogklasse
   //.....
}

B_Dialog.h

class A_Data

class B_Dialog
{
   friend class A_Data; // Datenklasse

   public:
   explicit B_Dialog( A_Data const * datas);

   private:
   A_Data * const myDatas;
   //...
}

B_Dialog.cpp
#include 'A_Data.h'

B_Dialog::B_Dialog
( A_Data * const datas)
: myDatas(datas)
{}
</code></pre>
<p>// bis hierhin funktioniert es einwandfrei</p>
<p>Für die zweite Dialogklasse (gleiche Struktur wie B_Dialog):</p>
<pre><code>C_Dialog.h

class A_Data

class C_Dialog
{
   friend class A_Data; // Datenklasse

   public:
   explicit C_Dialog( A_Data const * datas);

   private:
   A_Data * const myDatas;
   //...
}

C_Dialog.cpp
#include 'A_Data.h'

C_Dialog::C_Dialog
( A_Data * const datas)
: myDatas(datas)          // hier Compilerfehler (s.u.)
{}
</code></pre>
<p>gibt es folgende Compilerfehlermeldung:<br />
C_Dialog.cpp: error 2440: 'Initialisierung': const A_Data* kann nicht in const A_Data* 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.</p>
<p>Ich nehme an, es hängt mit der Reihenfolge von Deklarationen zusammen, habe auch schon einige Zeit gegoogelt, komme aber irgendwie nicht weiter.</p>
<p>Vielleicht könnt Ihr mir weiterhelfen.</p>
<p>Vielen Dank schon einmal im vorraus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2316958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2316958</guid><dc:creator><![CDATA[hinzman3]]></dc:creator><pubDate>Sat, 20 Apr 2013 11:52:27 GMT</pubDate></item><item><title><![CDATA[Reply to 2 Friend-Klassen funktionieren nicht, eine schon on Sat, 20 Apr 2013 12:20:22 GMT]]></title><description><![CDATA[<p>Zeig mal bitte einen Aufruf, der den Fehler provoziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2316962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2316962</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Sat, 20 Apr 2013 12:20:22 GMT</pubDate></item><item><title><![CDATA[Reply to 2 Friend-Klassen funktionieren nicht, eine schon on Sat, 20 Apr 2013 12:25:32 GMT]]></title><description><![CDATA[<p>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 <code>A_Data* const myDatas</code> ist ein konstanter Pointer, der Konstruktor erwartet aber einen nicht-konstanten Pointer mit konstantem Wert ( <code>A_Data const*</code> ).</p>
<p>Beachte, dass das Schlüsselwort <code>const</code> sich auf das bezieht, was links neben ihm steht.</p>
<p>Edit: Nach genauerem Hingucken, hab ich nun gemerkt, dass Du den gleichen Fehler auch in der C_Dialog-Klasse machst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2316963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2316963</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 20 Apr 2013 12:25:32 GMT</pubDate></item><item><title><![CDATA[Reply to 2 Friend-Klassen funktionieren nicht, eine schon on Sat, 20 Apr 2013 12:36:50 GMT]]></title><description><![CDATA[<p>gnihihihihi schrieb:</p>
<blockquote>
<p>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 <code>A_Data* const myDatas</code> ist ein konstanter Pointer, der Konstruktor erwartet aber einen nicht-konstanten Pointer mit konstantem Wert ( <code>A_Data const*</code> ).</p>
<p>Beachte, dass das Schlüsselwort <code>const</code> sich auf das bezieht, was links neben ihm steht.</p>
<p>Edit: Nach genauerem Hingucken, hab ich nun gemerkt, dass Du den gleichen Fehler auch in der C_Dialog-Klasse machst.</p>
</blockquote>
<p>Ah. Da haben wir's ja schon - hab ich nicht gesehen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2316971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2316971</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Sat, 20 Apr 2013 12:36:50 GMT</pubDate></item><item><title><![CDATA[Reply to 2 Friend-Klassen funktionieren nicht, eine schon on Sat, 20 Apr 2013 13:04:19 GMT]]></title><description><![CDATA[<p>Hallo,<br />
danke für die schnellen Antworten.<br />
Aber es war Schlamperei von mir bei der Eingabe, sorry <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Es heißt natürlich wie folgt und der Fehler ist immer noch vorhanden (s.u.):</p>
<pre><code>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)
{}
</code></pre>
<p>Ich habe das noch einmal genau kontrolliert, kompiliert und die Compilermeldung lautet jetzt:</p>
<p>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.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2316975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2316975</guid><dc:creator><![CDATA[hinzman3]]></dc:creator><pubDate>Sat, 20 Apr 2013 13:04:19 GMT</pubDate></item><item><title><![CDATA[Reply to 2 Friend-Klassen funktionieren nicht, eine schon on Sat, 20 Apr 2013 13:07:06 GMT]]></title><description><![CDATA[<p>Ist C_Dialog zufälligerweise in einem anderen Namespace als A_Data?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2316977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2316977</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 20 Apr 2013 13:07:06 GMT</pubDate></item><item><title><![CDATA[Reply to 2 Friend-Klassen funktionieren nicht, eine schon on Sat, 20 Apr 2013 13:12:34 GMT]]></title><description><![CDATA[<p>Nein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2316981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2316981</guid><dc:creator><![CDATA[hinzman3]]></dc:creator><pubDate>Sat, 20 Apr 2013 13:12:34 GMT</pubDate></item><item><title><![CDATA[Reply to 2 Friend-Klassen funktionieren nicht, eine schon on Sat, 20 Apr 2013 13:15:56 GMT]]></title><description><![CDATA[<p>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. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2316983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2316983</guid><dc:creator><![CDATA[hinzman3]]></dc:creator><pubDate>Sat, 20 Apr 2013 13:15:56 GMT</pubDate></item><item><title><![CDATA[Reply to 2 Friend-Klassen funktionieren nicht, eine schon on Sat, 20 Apr 2013 13:34:35 GMT]]></title><description><![CDATA[<p>Dann befolge <a href="http://www.c-plusplus.net/forum/304133" rel="nofollow">http://www.c-plusplus.net/forum/304133</a> und zeig uns das, was übrig bleibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2316988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2316988</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 20 Apr 2013 13:34:35 GMT</pubDate></item><item><title><![CDATA[Reply to 2 Friend-Klassen funktionieren nicht, eine schon on Sat, 20 Apr 2013 13:45:56 GMT]]></title><description><![CDATA[<p>Der Fehler hat auf jeden Fall nicht direkt mit <code>friend</code> zu tun, sondern damit dass es zwei verschiedene, nicht verwandte Klassen namens <code>A_Data</code> gibt.</p>
<p>Vermutlich bestehen Unterschiede zwischen der Deklaration oder Definition von <code>B_Dialog</code> und <code>C_Dialog</code> die du hier &quot;rausgekürzt&quot; hast, die dafür verwantwortlich sind dass es mit <code>B_Dialog</code> geht, mit <code>C_Dialog</code> aber nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2316992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2316992</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 20 Apr 2013 13:45:56 GMT</pubDate></item><item><title><![CDATA[Reply to 2 Friend-Klassen funktionieren nicht, eine schon on Sat, 20 Apr 2013 13:55:27 GMT]]></title><description><![CDATA[<p>zu hustbaer:<br />
Es gibt keine &quot;zwei verschiedene, nicht verwandte Klassen namens A_Data&quot;.</p>
<p>zu Nathan:<br />
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.<br />
Dauert aber, habe erst morgen Zeit.<br />
Danke erst einmal für die bisher getätigten Beiträge ! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2316997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2316997</guid><dc:creator><![CDATA[hinzman3]]></dc:creator><pubDate>Sat, 20 Apr 2013 13:55:27 GMT</pubDate></item><item><title><![CDATA[Reply to 2 Friend-Klassen funktionieren nicht, eine schon on Sat, 20 Apr 2013 14:03:33 GMT]]></title><description><![CDATA[<p>hinzman3 schrieb:</p>
<blockquote>
<p>zu hustbaer:<br />
Es gibt keine &quot;zwei verschiedene, nicht verwandte Klassen namens A_Data&quot;.</p>
</blockquote>
<p>Lass mich raten: es gibt keine Klasse namens A_Data im echten Code! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Aber so etwas passiert wirklich schnell, besonders bei Forwards.</p>
<p>Edit: Bei dir reicht es übrigens, sämtliche Member zu löschen und die Header zu posten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2316998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2316998</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 20 Apr 2013 14:03:33 GMT</pubDate></item><item><title><![CDATA[Reply to 2 Friend-Klassen funktionieren nicht, eine schon on Sat, 20 Apr 2013 18:43:16 GMT]]></title><description><![CDATA[<p>Hallo,<br />
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 !<br />
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.</p>
<p>Und siehe da, alles wird gut, keine Fehlermeldung mehr: <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>C1_Dialog.h</p>
<pre><code>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()
};
</code></pre>
<p>dazu dann C1_Dialog.cpp</p>
<pre><code>// C1_Dialog.cpp: Implementierungsdatei
//

#include &quot;stdafx.h&quot;
#include &quot;C1_Dialog.h&quot;
#include &quot;afxdialogex.h&quot;

// 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-Meldungshandler
</code></pre>
<p>Ich 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<br />
und die Dialogklasse wieder neu aufbauen. Manchmal hilft ein finaler Cut.</p>
<p>Danke an Alle für Ihre Bemühungen.</p>
<p>Bis zum nächsten mal. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2317061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2317061</guid><dc:creator><![CDATA[hinzman3]]></dc:creator><pubDate>Sat, 20 Apr 2013 18:43:16 GMT</pubDate></item></channel></rss>