<?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[Friend-Klasse will nicht ganz funktionieren]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich wollte gerade die &quot;friend&quot; Eigenschaft ausprobieren und mir eine Friend-Klasse basteln...</p>
<p>Ich habe eine Klasse Auto und eine Klasse Service,<br />
jetzt soll die Klasse Service auf das Atribut kmStand von Klasse Auto zugreifen können welches private ist.<br />
Das bedeutet Klasse Service muss eine friend-Klasse von Auto sein...</p>
<p>So sehe meine Header-Files aus:</p>
<pre><code class="language-cpp">#ifndef AUTO_H
#define	AUTO_H

class Auto {
    friend class Service;
public:
    Auto();
    Auto(double newVerbrauch, double newTankFuellung, int newKmStand = 0);
    ~Auto();

    double getVerbrauch() const;
    double getFuellung() const;
    int getKmStand() const;
    bool tanke(double liter);
    bool fahre(int km);
private:
    double verbrauch;
    double maxTankFuellung;
    double tankFuellung;
    int kmStand;
};

#endif	/* AUTO_H */
</code></pre>
<pre><code class="language-cpp">#ifndef SERVICE_H
#define	SERVICE_H

#include &quot;Auto.h&quot;

class Service {
public:
    Service();
    ~Service();

    int getKmStandAuto(Auto&amp; a);
private:
};

#endif	/* SERVICE_H */
</code></pre>
<p>Doch leider will das ganze nicht funktionieren sobald ich mein Programm laufen lasse erhalte ich eine Fehlermeldung:</p>
<pre><code>&quot;/usr/bin/make&quot; -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
&quot;/usr/bin/make&quot;  -f nbproject/Makefile-Debug.mk dist/Debug/GNU-MacOSX/aufgabe_1
mkdir -p build/Debug/GNU-MacOSX
rm -f build/Debug/GNU-MacOSX/Service.o.d
g++    -c -g -MMD -MP -MF build/Debug/GNU-MacOSX/Service.o.d -o build/Debug/GNU-MacOSX/Service.o Service.cpp
Auto.h: In function 'int getKmStandAuto(Auto&amp;)':
Auto.h:21: error: 'int Auto::kmStand' is private
Service.cpp:11: error: within this context
make[2]: *** [build/Debug/GNU-MacOSX/Service.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 111ms)
</code></pre>
<p>Also scheint das mit der der friend Eigenschaft nicht so ganz zu funktionieren, was genau mache ich den falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302573/friend-klasse-will-nicht-ganz-funktionieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 06:49:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302573.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 22 Apr 2012 11:49:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Friend-Klasse will nicht ganz funktionieren on Sun, 22 Apr 2012 11:49:00 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich wollte gerade die &quot;friend&quot; Eigenschaft ausprobieren und mir eine Friend-Klasse basteln...</p>
<p>Ich habe eine Klasse Auto und eine Klasse Service,<br />
jetzt soll die Klasse Service auf das Atribut kmStand von Klasse Auto zugreifen können welches private ist.<br />
Das bedeutet Klasse Service muss eine friend-Klasse von Auto sein...</p>
<p>So sehe meine Header-Files aus:</p>
<pre><code class="language-cpp">#ifndef AUTO_H
#define	AUTO_H

class Auto {
    friend class Service;
public:
    Auto();
    Auto(double newVerbrauch, double newTankFuellung, int newKmStand = 0);
    ~Auto();

    double getVerbrauch() const;
    double getFuellung() const;
    int getKmStand() const;
    bool tanke(double liter);
    bool fahre(int km);
private:
    double verbrauch;
    double maxTankFuellung;
    double tankFuellung;
    int kmStand;
};

#endif	/* AUTO_H */
</code></pre>
<pre><code class="language-cpp">#ifndef SERVICE_H
#define	SERVICE_H

#include &quot;Auto.h&quot;

class Service {
public:
    Service();
    ~Service();

    int getKmStandAuto(Auto&amp; a);
private:
};

#endif	/* SERVICE_H */
</code></pre>
<p>Doch leider will das ganze nicht funktionieren sobald ich mein Programm laufen lasse erhalte ich eine Fehlermeldung:</p>
<pre><code>&quot;/usr/bin/make&quot; -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
&quot;/usr/bin/make&quot;  -f nbproject/Makefile-Debug.mk dist/Debug/GNU-MacOSX/aufgabe_1
mkdir -p build/Debug/GNU-MacOSX
rm -f build/Debug/GNU-MacOSX/Service.o.d
g++    -c -g -MMD -MP -MF build/Debug/GNU-MacOSX/Service.o.d -o build/Debug/GNU-MacOSX/Service.o Service.cpp
Auto.h: In function 'int getKmStandAuto(Auto&amp;)':
Auto.h:21: error: 'int Auto::kmStand' is private
Service.cpp:11: error: within this context
make[2]: *** [build/Debug/GNU-MacOSX/Service.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 111ms)
</code></pre>
<p>Also scheint das mit der der friend Eigenschaft nicht so ganz zu funktionieren, was genau mache ich den falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204418</guid><dc:creator><![CDATA[vandread]]></dc:creator><pubDate>Sun, 22 Apr 2012 11:49:00 GMT</pubDate></item><item><title><![CDATA[Reply to Friend-Klasse will nicht ganz funktionieren on Sun, 22 Apr 2012 12:28:06 GMT]]></title><description><![CDATA[<p>Geht bei mir: <a href="http://ideone.com/d1xhq" rel="nofollow">http://ideone.com/d1xhq</a></p>
<p>Meins ist ja das Selbe wie deins, nur verkürzt...</p>
<p>Nebenbei:</p>
<ul>
<li>Kapselung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> <code>friend</code> nur auf die eine Methode</li>
<li>Konstante Referenz da das Auto beim Auslesen nicht verändert wird</li>
<li>Konstante Methode da der Service beim Auslesen nicht verändert wird</li>
</ul>
<p>Gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204431</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 22 Apr 2012 12:28:06 GMT</pubDate></item><item><title><![CDATA[Reply to Friend-Klasse will nicht ganz funktionieren on Sun, 22 Apr 2012 12:38:42 GMT]]></title><description><![CDATA[<p>Wenn ich alles in ein File schreibe, dann funktioniert es bei mir auch...<br />
Aber wenn ich es mit Header-Files aufsplitte dann funktioniert es irgendwie nicht mehr...</p>
<p>Das mit der Kapselung usw. ist mir klar (:<br />
Ich will erst mal dass das funktioniert... ):</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204433</guid><dc:creator><![CDATA[vandread]]></dc:creator><pubDate>Sun, 22 Apr 2012 12:38:42 GMT</pubDate></item><item><title><![CDATA[Reply to Friend-Klasse will nicht ganz funktionieren on Sun, 22 Apr 2012 12:47:02 GMT]]></title><description><![CDATA[<p>Dann wird es wahrscheinlich daran liegen, dass die Deklarationen/Definitionen nicht in der korrekten Reihenfolge sind (obwohl ich mir das zusammen mit dieser Fehlermeldung von deinem Compiler nicht wirklich vorstellen kann).<br />
Korrekte Reihenfolge in dem Fall:</p>
<ul>
<li>Klassendeklarationen</li>
<li>Klassendefinitionen (wenn du <code>friend</code> auf eine Methode machst spielt es hier eine Rolle, welche Klasse zuerst kommt)</li>
<li>Funktionsdefinitionen</li>
</ul>
<p>Ist dies durch deine Implementierung gewährleistet?</p>
<p>EDIT: Was mir erst jetzt auffällt ist, dass <code>Auto</code> eine <code>public</code> -Methode hat um auf die zurückgelegten Kilometer zurückzugreifen. Wieso ruft Service nicht diese auf?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204435</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 22 Apr 2012 12:47:02 GMT</pubDate></item><item><title><![CDATA[Reply to Friend-Klasse will nicht ganz funktionieren on Sun, 22 Apr 2012 12:51:19 GMT]]></title><description><![CDATA[<p>vandread schrieb:</p>
<blockquote>
<p>Wenn ich alles in ein File schreibe, dann funktioniert es bei mir auch...<br />
Aber wenn ich es mit Header-Files aufsplitte dann funktioniert es irgendwie nicht mehr...</p>
<p>Das mit der Kapselung usw. ist mir klar (:<br />
Ich will erst mal dass das funktioniert... ):</p>
</blockquote>
<p>Vermutung: du hast das Service:: vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204438</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 22 Apr 2012 12:51:19 GMT</pubDate></item><item><title><![CDATA[Reply to Friend-Klasse will nicht ganz funktionieren on Sun, 22 Apr 2012 13:04:59 GMT]]></title><description><![CDATA[<p>Service:: ???<br />
Wo soll das den hin?<br />
Dachte den Scope-Operator braucht man nur bei Namespaces...? Oo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204443</guid><dc:creator><![CDATA[vandread]]></dc:creator><pubDate>Sun, 22 Apr 2012 13:04:59 GMT</pubDate></item><item><title><![CDATA[Reply to Friend-Klasse will nicht ganz funktionieren on Sun, 22 Apr 2012 13:08:40 GMT]]></title><description><![CDATA[<p>Bei der Funktionsdefinition wenn sie ausserhalb der Klassendefinition ist (sieh es dir in meinen Code im obigen Post an).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204448</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 22 Apr 2012 13:08:40 GMT</pubDate></item><item><title><![CDATA[Reply to Friend-Klasse will nicht ganz funktionieren on Sun, 22 Apr 2012 13:26:06 GMT]]></title><description><![CDATA[<p>So jetzt blick ich gar nicht mehr durch...<br />
In deinem Beispiel arbeitest du doch mit einer friend-Funktion, ich will aber eine friend-Klasse und ich verstehe nicht wo ich da einen scope-Operator anwenden soll...</p>
<p>Ja ich weiß dass ich diese methode nutzen könnte, das wäre mir ja persönlich auch viel lieber, aber ich soll das leider so lösen weil das so auf dem Aufgabenblatt steht (:</p>
<p>Hier jetzt einfach mal der komplette Code...</p>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &quot;Auto.h&quot;
#include &quot;Service.h&quot;

using namespace std;

int main(int argc, char** argv) {
    Auto aAuto(3., 50., 20000);
    Service s;

    cout &lt;&lt; s.getKmStandAuto(aAuto);

    return 0;
}
</code></pre>
<p>Auto.h</p>
<pre><code class="language-cpp">#ifndef AUTO_H
#define	AUTO_H

class Auto {
    friend class Service;
public:
    Auto();
    Auto(double newVerbrauch, double newTankFuellung, int newKmStand = 0);
    ~Auto();

    double getVerbrauch() const;
    double getFuellung() const;
    int getKmStand() const;
    bool tanke(double liter);
    bool fahre(int km);
private:
    double verbrauch;
    double maxTankFuellung;
    double tankFuellung;
    int kmStand;
};

#endif	/* AUTO_H */
</code></pre>
<p>Auto.cpp</p>
<pre><code class="language-cpp">#include &quot;Auto.h&quot;

Auto::Auto()
:verbrauch(0.), maxTankFuellung(50.), tankFuellung(0.), kmStand(0) {
}

Auto::Auto(double newVerbrauch, double newTankFuellung, int newKmStand)
:verbrauch(newVerbrauch), maxTankFuellung(50.), tankFuellung(newTankFuellung), kmStand(newKmStand) {
}

Auto::~Auto() {
}

double Auto::getVerbrauch() const {
    return verbrauch;
}

double Auto::getFuellung() const {
    return tankFuellung;
}

int Auto::getKmStand() const {
    return kmStand;
}

bool Auto::tanke(double liter) {
    if (tankFuellung + liter &gt; maxTankFuellung) {
        return false;
    } else {
        tankFuellung = tankFuellung + liter;
        return true;
    }
}

bool Auto::fahre(int km) {
    if (km * (verbrauch / 100) &gt; tankFuellung) {
        return false;
    } else {
        tankFuellung = tankFuellung - (km * (verbrauch / 100));
        kmStand = kmStand + km;
        return true;
    }
}
</code></pre>
<p>Service.h</p>
<pre><code class="language-cpp">#ifndef SERVICE_H
#define	SERVICE_H

#include &quot;Auto.h&quot;

class Service {
public:
    Service();
    ~Service();

    int getKmStandAuto(Auto&amp; a);
private:
};

#endif	/* SERVICE_H */
</code></pre>
<p>Service.cpp</p>
<pre><code class="language-cpp">#include &quot;Service.h&quot;

Service::Service() {
}

Service::~Service() {
}

int getKmStandAuto(Auto&amp; a) {
    return a.kmStand;
}
</code></pre>
<p>Ich möchte ja nur das die Klasse Service zugriff auf alle Atribute von Auto hat ohne das Klassen-Interface von Auto zu nutzen, also ohne get-methoden...</p>
<p>Im Internet finde ich auch nur Beispiele wo das alles in einer C-File gemacht wird, so wie bei deinem Beispiel...<br />
Wenn ich das so mache funktioniert das ja bei mir auch, aber wie soll das den gehen wenn man das mit header-files macht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204458</guid><dc:creator><![CDATA[vandread]]></dc:creator><pubDate>Sun, 22 Apr 2012 13:26:06 GMT</pubDate></item><item><title><![CDATA[Reply to Friend-Klasse will nicht ganz funktionieren on Sun, 22 Apr 2012 13:29:51 GMT]]></title><description><![CDATA[<p>Da haben wir's!<br />
Zuerst inkludierst du <code>&quot;Auto.h&quot;</code> und ohne der Kenntnis über das Vorhandensein der Klasse <code>Service</code> willst du ihr den Zugriff auf die Klasse <code>Auto</code> erlauben.</p>
<p>Lösung: Klassendeklaration (wie in meinem Code <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204461</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 22 Apr 2012 13:29:51 GMT</pubDate></item><item><title><![CDATA[Reply to Friend-Klasse will nicht ganz funktionieren on Sun, 22 Apr 2012 13:31:30 GMT]]></title><description><![CDATA[<p>Omg... ich hab den Fehler gefunden... Tut mir leid... es muss natürlich so aussehen:</p>
<pre><code>int Service::getKmStandAuto(Auto&amp; a) {
    return a.kmStand;
}
</code></pre>
<p>Ich glaub ich brauch jetzt eine Pause...</p>
<p>---<br />
Edit:</p>
<p>Also ich hab jetzt einfach das abgeändert und so funktioniert es :S</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204462</guid><dc:creator><![CDATA[vandread]]></dc:creator><pubDate>Sun, 22 Apr 2012 13:31:30 GMT</pubDate></item><item><title><![CDATA[Reply to Friend-Klasse will nicht ganz funktionieren on Sun, 22 Apr 2012 13:33:14 GMT]]></title><description><![CDATA[<p>vandread schrieb:</p>
<blockquote>
<p>Edit:</p>
<p>Also ich hab jetzt einfach das abgeändert und so funktioniert es :S</p>
</blockquote>
<p>Das auch, hab ich übersehen, entschuldige</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204464</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 22 Apr 2012 13:33:14 GMT</pubDate></item></channel></rss>